为什么我在执行 strcat() 时得到错误的源字符串输出?

Why I am getting wrong output for source string when I am implementing strcat()?

我在这里尝试在 C 中实现 strcat 函数。问题是当我打印源字符串时它显示 "hyam" 而不是 "shyam"

#include <stdio.h>
#include <string.h>

char *fun(char *target, const char *source) {
    printf("%s\n", source);
    int x = strlen(target);
    while (*source != '[=10=]') {
        *(target + x++) = *source++;
    }
    *(target + x) = '[=10=]';
    return target;
}

int main() {
    char target[] = "ram";
    char source[] = "shyam";
    fun(target, source);
    printf("%s\n", target);
    printf("%s", source);
    return 0;
}

输出的最后一行显示 hyam,但它应该是 shyam

shyam
ramshyam
hyam

问题是用 char target[] = "ram"; 定义的数组 target 太短,无法容纳追加 source 字符串的内容。您必须使 target 更大,至少 9 个字节,字符 8 个,空终止符再多一个:

char target[9] = "ram";

您的 target 数组太小 - 它至少需要九个元素(两个字符串的长度加上终止零)。

写在 target 之外有未定义的行为,但在实践中,看起来你的数组恰好是首尾相连的,就像这样:

 |r|a|m|[=10=]|s|h|y|a|m|[=10=]|
 ^        ^
 |        | 
target   source

然后你连接,越过 target 的末尾进入 source:

 |r|a|m|s|h|y|a|m|[=11=]|[=11=]|
 ^       ^
 |       | 
target  source

这使得它看起来像 's' 已经消失了。

(请注意,这是 undefined,所以任何事情都有可能发生。你不能依赖这种行为,除非你的编译器的文档说它很好并且应该这样做. 它很可能不会。)