显示来自对象的字符数组
Displaying an array of char from an object
我正在制作一个简单的程序,它允许我通过将字符数组发送到公共成员函数中来设置对象的名称,然后更改名为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
适合这项工作,但您还需要为空终止符 ( ' '
) 腾出空间。它是附加到每个字符串末尾的字符,如果您不添加它并稍后尝试打印name
,std::cout
将不知道在哪里停止打印每个字符(这也是未定义的行为)。
在setName
内部,这应该是将动态内存分配给name
:
name = new char[strlen(inputName) + 1];
含义:(inputName
中的字符数 + 空终止符)。注意:strlen
不计算空终止符。
现在,要设置 null 终止符,您只需在 for()
循环下方执行此操作:
name[n] = ' ';
此外,当您完成使用内存时 name
,您必须将其删除。您可以使用delete[]
来执行此操作:
delete[] name;
建议的替代方法是使用std::string
本身管理内存的标准C++字符串类。
- 指向指向字符数组的指针数组的指针
- 比较字符数组
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 使用无符号字符数组有效存储内存
- 错误:字符数组的初始值设定项太多
- 对字符数组中的元素执行逐位操作
- C++ 无法在字符数组中使用 for 循环打印字母模式
- 如何在 C++ 中从文件中读取字符数组(带有一些空格)
- C++ 传递二维字符数组
- 无法在 C++ 中输入字符数组
- 字符数组中的元素数
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- 使用字符数组作为 Map 中的键
- C++:__aligned(__alignof__) 导致字符数组数据出现问题?
- 按顺序声明的字符数组重叠
- 在 C++ 中字符串的大小与字符数组的大小
- 寻找一种更好的方法来表示无符号字符数组
- 如何打印 2D 字符数组C++
- 从字符数组的元素中减去'a'是什么意思
- 我是否不正确地集中了这些字符数组?