scanf时与char数组混淆

use*_*304 4 c memory scanf char

我对一个小程序感到困惑.

#include <stdio.h>

#define LEN 10

int main()
{
    char str1[LEN] = "\0";
    char str2[LEN] = "\0";

    scanf("%s", str1);
    scanf("%s", str2);

    printf("%s\n", str1);
    printf("%s\n", str2);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我的输入是:

mangobatao
mangobatao123456

为什么输出应该是:

123456
mangobatao123456

并不是:

mangobatao
mangobatao123456

如何char在内存中分配数组?

Car*_*rum 6

好吧,10个字符的char数组不适合"mangobatao",因为它有10个字符 - 没有空终止符.这意味着您已经导致了未定义的行为,因此任何事情都可能发生.

在这种情况下,它看起来像你的编译器str2之前str1在内存中布局,所以当你调用scanffill时str2,较长的字符串会覆盖开头str1.这就是为什么你看到你在str2尝试打印时应该想到的结果str1.如果您使用100的长度,您的示例将正常工作.