首页 > 解决方案 > 奇怪的输出打印字符数组

问题描述

人头

class human
{    
    char name[];    
    public:

    void setName(char nameValue[]);
    char* getName();
}

人类cpp

void human::setName(char nameValue[])
{    
    char name[] = "walter";         
}

char* human::getName()
{
    return name;
}

主cpp

int main()
{
    human myHuman;
    char name[] = "walter";
   
    myHuman.setName(name);
    char* result3 = myHuman.getName();
     
    cout << "My human has a name of " << result3 << endl;
   
    return 0;   
}

我分配了字符串"walter",但是当我打印它时,我得到“╠╠╠╠╦ß╩d└²╒”。

我不明白哪一部分是错的。你能告诉我我的代码有什么问题吗?

标签: c++arraysstringchar

解决方案


首先,您要分配nameValue给函数的局部变量setName,这意味着name当您将类变量返回时,它仍然是未初始化的getName,因此输出奇怪。

char name[];声明也不正确,C++ 不允许可变长度数组或具有未指定边界的数组,除非它们立即初始化,在这种情况下,将根据分配的字符串的大小推导出大小。

关于这一点,警告必须是由您的编译器发出的,如果没有,请启动它们,或者更好的是,让它将警告视为错误,您将拥有更健壮的代码。

出于分配的目的,您应该继续使用指针,出现一个小问题,因为 C++ 不允许将字符串文字分配给char*变量,如果您使用const char*,这很容易解决,您的编译器可能允许前者,但这是非法的根据 C++ 规则。

应用上面的更正,您的代码应该看起来更像这样:

class human
{
    const char* name;

public:
    void setName(const char *nameValue);
    const char* getName();
};

void human::setName(const char *nameValue)
{
  name = nameValue;
}

const char* human::getName(){
    return name;
}

int main()
{
    human myHuman;
    const char* name = "walter";
    myHuman.setName(name);
    const char* result3 = myHuman.getName();
    cout << "My human has a name of " << result3 << endl;
    return EXIT_SUCCESS;
}

推荐阅读