我需要一个空的char数组,但是当我尝试做这样的事情时:
char *c;
c = new char [m];
int i;
for (i = 0; i < m; i++)
c[i] = 65 + i;
然后我打印c
。可以看到c = 0x00384900 "НННННННээээ««««««««юоюою"
在循环后它变为:0x00384900 "ABCDEFGээээ««««««««юоюою"
我怎么解决这个问题?或者也许有字符串的方式?
答案 0 :(得分:3)
如果您正在尝试创建字符串,则需要确保字符序列以空字符\0
终止。
换句话说:
char *c;
c = new char [m+1];
int i;
for (i = 0; i < m; i++)
c[i] = 65 + i;
c[m] = '\0';
没有它,像printf
这样的字符串上的函数将不知道字符串的结束位置。
printf("%s\n",c); // should work now
答案 1 :(得分:3)
如果您创建堆数组,OS将不会初始化它。 为此,您可以选择以下选项:
::memset( c, 0, m );
以零填充它。答案 2 :(得分:2)
我相信你的调试器试图解释字符串。使用char数组表示C或C ++中的字符串时,需要在字符串的末尾包含一个空字节。因此,如果为c分配m + 1
个字符,然后设置c[m] = '\0'
,则调试器应该为您提供您期望的值。
答案 3 :(得分:1)
如果你想要一个动态分配的字符串,那么最好的选择是使用标准库中的string
类:
#include <string>
std::string s;
for (i = 0; i < m; i++)
s.push_back(65 + i);
答案 4 :(得分:0)
C字符串以空值终止。这意味着最后一个字符必须是空字符('\ 0'或只是0)。
操作字符串的函数使用数组开头(作为参数传递,数组中的第一个位置)和空值之间的字符。如果数组中没有空字符,函数将迭代传递它的内存,直到找到一个(内存泄漏)。这就是为什么你的例子中印有一些垃圾。
当您在代码中看到文字常量时,如printf("Hello");
,它会转换为长度为6的字符数组('H','e','l','l','o '和'\ 0');
当然,为了避免这种复杂性,您可以使用std :: string。