所以我读到了strcat
函数应谨慎使用,因为目标字符串应足够大以容纳其自身和源字符串的内容。我编写的以下程序也是如此:
#include <stdio.h>
#include <string.h>
int main(){
char *src, *dest;
printf("Enter Source String : ");
fgets(src, 10, stdin);
printf("Enter destination String : ");
fgets(dest, 20, stdin);
strcat(dest, src);
printf("Concatenated string is %s", dest);
return 0;
}
但对于我在这里写的那篇文章来说并非如此:
#include <stdio.h>
#include <string.h>
int main(){
char src[11] = "Hello ABC";
char dest[15] = "Hello DEFGIJK";
strcat(dest, src);
printf("concatenated string %s", dest);
getchar();
return 0;
}
该程序最终将两者相加,而没有考虑目标字符串不够大。为什么会这样呢?
The strcat
函数无法确切知道目标缓冲区有多长,因此它假设传递给它的缓冲区足够大。如果不是,您调用未定义的行为 https://en.wikipedia.org/wiki/Undefined_behavior通过写入超过缓冲区末尾。这就是第二段代码中发生的情况。
第一段代码也是无效的,因为src
and dest
是未初始化的指针。当你将它们传递给fgets
,它读取它们包含的任何垃圾值,将其视为有效地址,然后尝试将值写入该无效地址。这也是未定义的行为。
C 语言之所以快速的原因之一是它不会检查以确保您遵守规则。它只是告诉你规则并假设你遵守这些规则,如果你不遵守,坏事可能会发生,也可能不会发生。在您的特定情况下,它似乎有效,但不能保证这一点。
例如,当我运行你的第二段代码时,它似乎也可以工作。但如果我把它改成这样:
#include <stdio.h>
#include <string.h>
int main(){
char dest[15] = "Hello DEFGIJK";
strcat(dest, "Hello ABC XXXXXXXXXX");
printf("concatenated string %s", dest);
return 0;
}
程序崩溃了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)