scanf时与char数组混淆

时间:2011-09-01 22:57:21

标签: c memory char scanf

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

#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;
}

如果我输入的是:

  

mangobatao
  mangobatao123456

为什么输出应该是:

  

123456
  mangobatao123456

而不是:

  

mangobatao
  mangobatao123456

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

2 个答案:

答案 0 :(得分:6)

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

在这种情况下,看起来您的编译器已在str2之前在内存中列出str1,因此当您调用scanf填充str2时,更长的字符串会覆盖str1的开头。这就是为什么在尝试打印str2时,您会看到{J} {1}}中的结果。如果您使用100的长度,您的示例将正常工作。

答案 1 :(得分:0)

我认为你的编译器在str1指针之前为str2 [10]分配了10个字符的空间。

现在,当您在str2处扫描长度为16的字符串时,字符串终止符'\ 0'将附加在str2 +第17位,这实际上是str1 + 7.

现在,当你在str1调用printf时,读取的字符实际上是str2 + 11,str2 + 12,...,str2 + 16,直到在str2 + 17(或str1 + 7)遇到空终止符。 str2的printf必须明显。