“C 中的 strcat 函数假设目标字符串足够大,可以容纳源字符串及其自身的内容”中的混乱。

2024-03-09

所以我读到了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(使用前将#替换为@)

“C 中的 strcat 函数假设目标字符串足够大,可以容纳源字符串及其自身的内容”中的混乱。 的相关文章

随机推荐