1

我需要在一个类中存储一个 char 数组,然后返回它。我不得不承认我对指针有点困惑,并且已经尝试了我能想到的所有东西,但无法让它发挥作用。这是我所拥有的:

#include <iostream>
using namespace std;

class Test {
public:
    void setName(char *name);
    char getName();
private:
    char m_name[30];
};

void Test::setName(char *name) {
    strcpy(m_name, name);
}

char Test::getName() {
    return *m_name;
}

void main() {

    Test foobar;
    char name[] = "Testing";
    foobar.setName(name);
    cout << foobar.getName();
}

当然,我希望 setName() 将字符串“Testing”存储在类中,而 getName() 应该返回“Testing”。但相反,我只得到第一个字母 T。我做错了什么?

我想我应该使用 std 字符串,但首先我想了解为什么这不起作用。据我所知,这也应该适用于 char 数组?

4

5 回答 5

7

只需返回一个指针:

const char* Test::getName() const
{
    return m_name;
}

并添加一个构造函数class Test,它将以空值终止封装的数组:

Test::Test()
{
    m_name[0] = 0;
}

class Test这样如果有人实例化并且不调用实例,您就不会自找麻烦setName()

于 2009-10-29T07:24:30.387 回答
2

如果您希望这是 C++,除非您有非常非常具体的理由,否则不要使用 char 指针!

从 char 指针切换到 std::string 并查看是否可以解决您的问题:

#include <iostream>
#include <string>
using namespace std;

class Test {
public:
    void setName(std::string name);
    std::string getName();
private:
    std::string m_name;
};

void Test::setName(std::string name) {
    m_name = name;
}

std::string Test::getName() {
    return m_name;
}

void main() { 
    Test foobar;
    foobar.setName("Testing");
    cout << foobar.getName();
}

对于加分,将 setName 中的参数类型设为 const std::string&。

于 2009-10-29T07:59:44.817 回答
2

Test::getName()你只是返回一个字符(第一个字符)。相反,您应该返回字符串开始的第一个字符的地址,即将返回类型更改为char*并将返回语句更改为return m_name;

于 2009-10-29T07:26:39.453 回答
1

当您有一个指针时p,指针解引用运算符*“跟随”指针,因此表达式的*p计算结果为指针指向的任何对象。

在许多情况下,数组的名称(例如m_name, )的行为类似于指针。因此,*m_name计算为char数组中的第一个,因为这是数组名称在解释为指针时指向的类型。

由于 C 中的字符串表示为指向字符的指针,因此不应取消引用指针,而应将其原封不动地返回。

许多人建议您使用strncpy()将输入字符串写入数组,因为它会进行(某种)边界检查。但是,它不是最优的,它的语义很奇怪,将字符串复制到有限的缓冲区中确实不是它的设计目的。最好调查一下您的snprintf()环境中是否有各种功能,并像这样使用它:

snprintf(m_name, sizeof m_name, "%s", name);
于 2009-10-29T07:40:53.217 回答
0

使用此代码获取名称:

void Test::getName()
{
std::cout << "\nYour name is: ";
for (int i = 0; i < 30; i++)
{
if (Name[i] !=NULL)
std::cout << Name[i];
else break;
}
std::cout << "\n";
}
于 2022-02-16T13:09:05.297 回答