首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么我必须先使用strcpy(),然后再使用strcat()?

为什么我必须先使用strcpy(),然后再使用strcat()?
EN

Stack Overflow用户
提问于 2013-09-17 07:20:42
回答 5查看 52.5K关注 0票数 30

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

代码语言:javascript
复制
char stuff[100];
strcat(stuff,"hi ");
strcat(stuff,"there");

但这不是吗?

代码语言:javascript
复制
char stuff[100];
strcpy(stuff,"hi ");
strcat(stuff,"there");
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-09-17 07:24:13

strcat将查找空终止符,将其解释为字符串的末尾,并将新文本附加到那里,覆盖进程中的空终止符,并在连接的末尾编写新的空终止符。

代码语言:javascript
复制
char stuff[100];  // 'stuff' is uninitialized

空终止符在哪里?stuff未初始化,所以它可能以NUL开头,也可能没有NUL。

在C++中,您可以执行以下操作:

代码语言:javascript
复制
char stuff[100] = {};  // 'stuff' is initialized to all zeroes

现在可以执行strcat了,因为“stuff”的第一个字符是空结束符,所以它会附加到正确的位置。

在C中,你仍然需要初始化“stuff”,这可以通过几种方式来完成:

代码语言:javascript
复制
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.
票数 45
EN

Stack Overflow用户

发布于 2013-09-17 07:25:09

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

代码语言:javascript
复制
strcat(stuff, "hi ");

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

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

代码语言:javascript
复制
char stuff[100];
stuff[0] = '\0';      /* ensures stuff contains a valid string */
strcat(stuff, "hi ");
strcat(stuff, "there");

也可以将stuff初始化为空字符串:

代码语言:javascript
复制
char stuff[100] = "";

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

票数 5
EN

Stack Overflow用户

发布于 2013-09-17 07:25:24

因为在调用strcpy之前stuff未初始化。在声明stuff不是空字符串之后,它是未初始化的数据。

strcat将数据附加到字符串的末尾-也就是说,它在字符串中查找空终止符,并在其后添加字符。未初始化的字符串不会有null结束符,因此strcat很可能会崩溃。

如果要初始化stuff,如下所示,您可以执行strcat:

代码语言:javascript
复制
char stuff[100] = "";
strcat(stuff,"hi ");
strcat(stuff,"there");
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18838933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档