1

我需要一个空字符数组,但是当我尝试这样做时:

char *c; 
c = new char [m];
int i;
    for (i = 0; i < m; i++)
    c[i] = 65 + i;

然后我打印c. 可以看到c = 0x00384900 "НННННННээээ««««««««юоюою" 循环之后变成:0x00384900 "ABCDEFGээээ««««««««юоюою" 我该如何解决这个问题?或者也许有字符串的方法?

4

5 回答 5

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
于 2012-06-18T15:50:08.837 回答
3

如果你创建一个堆数组,操作系统不会初始化它。为此,您可以使用以下选项:

  1. 静态或全局分配数组。数组将自动填充零。
  2. 在堆初始化或堆栈数组上使用::memset( c, 0, m );以用零填充它。
  3. 使用高级类型,如 std::string。
于 2012-06-18T15:52:56.807 回答
2

我相信那是你的调试器试图解释字符串。在 C 或 C++ 中使用 char 数组表示字符串时,需要在字符串末尾包含一个空字节。所以,如果你m + 1为 c 分配字符,然后设置c[m] = '\0',你的调试器应该给你你期望的值。

于 2012-06-18T15:50:38.557 回答
1

如果你想要一个动态分配的字符串,那么最好的选择是使用string标准库中的类:

#include <string>

std::string s;
for (i = 0; i < m; i++)
    s.push_back(65 + i);
于 2012-06-18T16:04:21.307 回答
0

C 字符串以 null 结尾。这意味着最后一个字符必须是空字符('\0' 或只是 0)。

操作字符串的函数使用数组开头(作为参数传递,数组中的第一个位置)和空值之间的字符。如果您的数组中没有空字符,该函数将迭代传递它的内存,直到找到一个(内存泄漏)。这就是为什么您在示例中打印了一些垃圾。

当您在代码中看到文字常量时,例如printf("Hello");,它会被转换为长度为 6 的字符数组('H'、'e'、'l'、'l'、'o' 和 '\0');

当然,为了避免这种复杂性,您可以使用 std::string。

于 2012-06-18T17:02:52.877 回答