显示来自对象的字符数组

Displaying an array of char from an object

本文关键字:字符 数组 对象 显示      更新时间:2023-10-16

我正在制作一个简单的程序,它允许我通过将字符数组发送到公共成员函数中来设置对象的名称,然后更改名为name的私有变量。然后我告诉我的类把 name 变量吐出来,这样我就可以看看它是否正常工作——但我的输出大多是乱码。

即,我输入

"苹果"

输出变为

"AAAAA╠╠╠╠╠苹果"

我注意到,当我更改单词时,重复字符的数量模仿单词中的字符数量 - 但我似乎无法弄清楚我在哪里搞砸了我的程序。这是我的代码:

*注意:下面的代码现在按预期工作。

    #include <iostream>
    #include <cstring>
    using namespace std;
    class Item{
         public:
    ~Item() { delete [] name; }
    char *setName(char * inputName)
    {
        name = new char[strlen(inputName)+1];
        int n = 0;
        for(n = 0; n<strlen(inputName); n++)
            name[n] = inputName[n];
        name[n] = '';
            return name;
    }
        private:
            char *name;
};

    int main()
    {
        char objectname[] = "Apple";
        Item Apple;
        cout << Apple.setName(objectname);
        int input;
        cin >> input; //pause program
    }

正如我在评论中所说,您永远不会为name分配内存.使用name[n]时,您将取消引用不属于您的地址。这会导致程序中出现未定义的行为,这意味着可能发生任何不符合程序逻辑的事情。它甚至可以很好地编译,但你不能依赖它。

无论如何,您需要为name分配内存。但是为此,您需要知道要将其分配给的内存的大小。我们不知道内存的大小(它可以是发送到setName的任意字符串)。因此name必须是一个指针:

char* name;

然后我们可以为其分配内存。顺便说一句,char name[]是一个零大小的数组,这在C++是非法的。

setName 中,您需要获取发送给它的字符串的大小。 strlen适合这项工作,但您还需要为空终止符 ( '' ) 腾出空间。它是附加到每个字符串末尾的字符,如果您不添加它并稍后尝试打印namestd::cout将不知道在哪里停止打印每个字符(这也是未定义的行为)。

setName内部,这应该是将动态内存分配给name

name = new char[strlen(inputName) + 1];

含义:(inputName 中的字符数 + 空终止符)。注意:strlen不计算空终止符。

现在,要设置 null 终止符,您只需在 for() 循环下方执行此操作:

name[n] = '';

此外,当您完成使用内存时 name ,您必须将其删除。您可以使用delete[]来执行此操作:

delete[] name;

建议的替代方法是使用std::string本身管理内存的标准C++字符串类。