为什么我首先要在strcat()之前使用strcpy()?

Or *_*ser 23 c cstring

为什么此代码会产生运行时问题:

char stuff[100];
strcat(stuff,"hi ");
strcat(stuff,"there");
Run Code Online (Sandbox Code Playgroud)

但这不是吗?

char stuff[100];
strcpy(stuff,"hi ");
strcat(stuff,"there");
Run Code Online (Sandbox Code Playgroud)

Tim*_*Tim 34

strcat 将查找null-terminator,将其解释为字符串的结尾,并在其中附加新文本,覆盖进程中的null-terminator,并在连接结束时写入新的null-terminator.

char stuff[100];  // 'stuff' is uninitialized
Run Code Online (Sandbox Code Playgroud)

空终止符在哪里? stuff是未初始化的,所以它可能从NUL开始,或者它可能没有NUL在其中任何地方.

在C++中,您可以这样做:

char stuff[100] = {};  // 'stuff' is initialized to all zeroes
Run Code Online (Sandbox Code Playgroud)

现在你可以做strcat,因为'stuff'的第一个字符是null-terminator,所以它会附加到正确的位置.

在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.
Run Code Online (Sandbox Code Playgroud)

  • 你应该可以做`char stuff [100] = {0};`. (9认同)
  • `{}`不是C中的有效初始值设定项. (3认同)

Kei*_*son 5

在第一种情况下,stuff包含垃圾. strcat要求目标和源都包含正确的以null结尾的字符串.

strcat(stuff, "hi ");
Run Code Online (Sandbox Code Playgroud)

将扫描stuff终止'\0'字符,它将开始复制"hi ".如果它没有找到它,它将从数组的末尾运行,并且可能发生任意不好的事情(即,行为是未定义的).

避免这个问题的一种方法是这样的:

char stuff[100];
stuff[0] = '\0';      /* ensures stuff contains a valid string */
strcat(stuff, "hi ");
strcat(stuff, "there");
Run Code Online (Sandbox Code Playgroud)

或者您可以初始化stuff为空字符串:

char stuff[100] = "";
Run Code Online (Sandbox Code Playgroud)

这将填充所有100个字节的stuff零(增加的清晰度可能值得任何小的性能问题).