当我运行示例代码时,wordLength为7(因此输出7)。但是我的char数组在最后得到了一些非常奇怪的字符。
wordLength = word.length();
cout << wordLength;
char * wordchar = new char[wordLength]; //new char[7]; ??
for (int i = 0; i < word.length(); i++) //0-6 = 7
{
wordchar[i] = 'a';
}
cout << wordchar;
输出:7aaaaaaa²²²²|||||||||||||
所需的输出是:aaaaaaa ......它背后的垃圾是什么?那是怎么结束的呢?
答案 0 :(得分:5)
您应该在\0
的末尾添加wordchar
。
char * wordchar = new char[wordLength +1];
//add chars as you have done
wordchar[wordLength] = `\0`
原因是C字符串以空值终止。
答案 1 :(得分:3)
C字符串以标记其结尾的'\ 0'字符终止(相反,C ++ std::string
仅分别存储长度。)
在将字符复制到wordchar
时,您没有终止字符串,因此,当operator<<
输出wordchar
时,它会继续,直到找到第一个\0
字符恰好位于wordchar
指向的内存位置之后,并且在此过程中它会打印恰好位于内存中的所有垃圾值。
要解决问题,您应该:
\0
字符。但是,在C ++中,您通常只想使用std::string
。
答案 2 :(得分:1)
使用: -
char * wordchar = new char[wordLength+1]; // 1 extra for null character
在for循环和
之前 wordchar[i] ='\0'
在for循环之后,C字符串以空值终止。
如果没有它,它会继续打印,直到找到第一个空字符,打印所有垃圾值。
答案 3 :(得分:1)
你避免了尾随零,这就是原因。
在C和C ++中,整个生态系统处理字符串长度的方式是假定尾随零('\0'
或简单0
数字)。这与例如pascal字符串不同,其中内存表示以数字开头,该数字表示下一个字符包含特定字符串的数量。
因此,如果您要存储某个字符串内容,则必须为尾随零分配一个额外字节。如果你操纵内存内容,你将始终记住尾随零并保留它。否则strstr
和其他字符串操作函数可以在运行轨道时改变内存内容并继续处理以下内存部分。没有尾随零strlen
也会给出错误的结果,它也会计算,直到它遇到第一个零。
您不是唯一犯这个错误的人,它经常在安全漏洞及其漏洞中扮演重要角色。该漏洞利用了功能消失的副作用,并操纵了最初预期的其他东西。这是C的一个非常重要和危险的部分。
在C ++中(当你标记你的问题时)你最好使用STL的std::string
和STL方法而不是C风格的操作。