首页 > 解决方案 > “C 中的 strcat 函数假定目标字符串大到足以容纳源字符串及其自身的内容”中的混淆。

问题描述

所以我读到这个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;
}

该程序最终将两者都添加了,而没有考虑到目标字符串不够大。为什么会这样?

标签: cstringstrcat

解决方案


strcat函数无法确切知道目标缓冲区的长度,因此它假定传递给它的缓冲区足够大。如果不是,则通过写入缓冲区末尾来调用未定义的行为。这就是第二段代码中发生的事情。

第一段代码也是无效的,因为srcdest都是未初始化的指针。当您将它们传递给 时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;
}

程序崩溃。


推荐阅读