将char数组存储在类中,然后返回它

时间:2009-10-29 07:22:13

标签: c++ arrays class char return

我需要在类中存储一个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数组?

5 个答案:

答案 0 :(得分:6)

只需返回一个指针:

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

并为class Test添加一个构造函数,该构造函数将终止封装的数组:

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

如果有人实例化class Test并且没有在实例上调用setName(),那么您就不会有问题。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

当你有一个指针p时,指针解引用运算符*“跟随”指针,所以表达式*p计算指针所指向的任何对象。

在许多情况下,m_name等数组的名称可以像指针一样运行。因此,*m_name计算数组中的第一个char,因为这是数组名称的类型,当被解释为指针时,指向。

由于C中的字符串表示为字符的指针,因此不应取消引用指针,而应将其保持原样。

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

snprintf(m_name, sizeof m_name, "%s", name);

答案 3 :(得分:0)

strncpy()

中使用strcpy()而不是void Test::setName()更安全

答案 4 :(得分:0)

如果你想让它成为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&amp;。