因此,我读到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,因此理想情况下,输出应为--。但是,由于编译器碰巧是如何在内存中排列s1s2的,所以我实际得到的输出是-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/

10-12 14:56