为什么这段代码会产生运行时问题:
char stuff[100];
strcat(stuff,"hi ");
strcat(stuff,"there");
但这不是吗?
char stuff[100];
strcpy(stuff,"hi ");
strcat(stuff,"there");
发布于 2013-09-17 07:24:13
strcat
将查找空终止符,将其解释为字符串的末尾,并将新文本附加到那里,覆盖进程中的空终止符,并在连接的末尾编写新的空终止符。
char stuff[100]; // 'stuff' is uninitialized
空终止符在哪里?stuff
未初始化,所以它可能以NUL开头,也可能没有NUL。
在C++中,您可以执行以下操作:
char stuff[100] = {}; // 'stuff' is initialized to all zeroes
现在可以执行strcat了,因为“stuff”的第一个字符是空结束符,所以它会附加到正确的位置。
在C中,你仍然需要初始化“stuff”,这可以通过几种方式来完成:
char stuff[100]; // not initialized
stuff[0] = '\0'; // first character is now the null terminator,
// so 'stuff' is effectively ""
strcpy(stuff, "hi "); // this initializes 'stuff' if it's not already.
发布于 2013-09-17 07:25:09
在第一种情况下,stuff
包含垃圾。strcat
要求目标和源都包含正确的以null结尾的字符串。
strcat(stuff, "hi ");
将扫描stuff
以查找终止的'\0'
字符,并开始复制"hi "
。如果它找不到它,它将运行在数组的末尾,并且可能发生任意不好的事情(即,行为未定义)。
避免这个问题的一种方法是:
char stuff[100];
stuff[0] = '\0'; /* ensures stuff contains a valid string */
strcat(stuff, "hi ");
strcat(stuff, "there");
也可以将stuff
初始化为空字符串:
char stuff[100] = "";
这将用零填充所有100字节的stuff
(增加的清晰度可能值得任何小的性能问题)。
发布于 2013-09-17 07:25:24
因为在调用strcpy
之前stuff
未初始化。在声明stuff
不是空字符串之后,它是未初始化的数据。
strcat
将数据附加到字符串的末尾-也就是说,它在字符串中查找空终止符,并在其后添加字符。未初始化的字符串不会有null结束符,因此strcat
很可能会崩溃。
如果要初始化stuff
,如下所示,您可以执行strcat:
char stuff[100] = "";
strcat(stuff,"hi ");
strcat(stuff,"there");
https://stackoverflow.com/questions/18838933
复制相似问题