因此,我读到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;
}
该程序最终将两者都添加,而不考虑目标字符串不够大。为什么会这样呢?
最佳答案
strcat()
function确实要谨慎使用,因为它不能保护您免受任何伤害。如果源字符串不是NULL终止的,目标字符串不是NULL终止的,或者目标字符串没有足够的空间,则strcat
仍将复制数据。因此,很容易覆盖本来不是要覆盖的数据。确保有足够的空间是您的责任。使用 strncat()
代替strcat
也将为您提供额外的安全性。
编辑这是一个示例:
#include <stdio.h>
#include <string.h>
int main()
{
char s1[16] = {0};
char s2[16] = {0};
strcpy(s2, "0123456789abcdefOOPS WAY TOO LONG");
/* ^^^ purposefully copy too much data into s2 */
printf("-%s-\n",s1);
return 0;
}
我从未分配过s1
,因此理想情况下,输出应为--
。但是,由于编译器碰巧是如何在内存中排列s1
和s2
的,所以我实际得到的输出是-OOPS WAY TOO LONG-
。 strcpy(s2,...)
也覆盖了s1
的内容。在gcc上,
-Wall
或-Wstringop-overflow
将帮助您检测类似这样的情况,在这种情况下,编译器知道源字符串的大小。但是,总的来说,编译器无法知道您的数据量。因此,您必须编写代码以确保所复制的内容不会超出您的空间。关于c - “strcat function in C assumes the destination string is large enough to hold contents of source string and its own.”中的困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51860543/