为什么这个c程序输出奇怪的字符?

use*_*964 0 c

在Windows下的MinGW中编译后,下面的C代码给出了我无法理解的输出.

#include <stdio.h>
main()
{
    char s[100];
    int i,c;
    for(i=0;i<100-1&&(c=getchar())!=EOF&&c!='\n';++i)
        s[i]=c;
    if(c=='\n'){
        s[i]=c;
        ++i;
    }
    s[i]='p';
    printf("%s",s);
}
Run Code Online (Sandbox Code Playgroud)

输出是

在此输入图像描述

为什么"p"后面有奇怪的字符?他们的意思是什么?

Oli*_*rLi 5

c中的字符串需要以null结尾.这意味着字符串的最后一个字符必须始终存在\0.

这就是你编程的方法,知道在哪里停止读取字符串,因为它是一个简单的数组char,不包含你在c ++这样的高级语言中习惯的长度信息.

编辑:奇怪的字符是读取有效字符后内存的结果.由于该内存不包含有效字符,因此可以以各种不可预测的方式进行解释.

  • 创建数组`s`时,其内容是垃圾.你只宣传了其中的一部分; 其余的包含垃圾,这就是正在打印的内容.如果你是"幸运的",垃圾中的某个地方恰好会出现空字符,而'printf`将在此时停止打印.如果没有,它将继续超过`s`的结尾,导致*未定义的行为*(它可能从内存中打印更多垃圾,或者它可能会崩溃,或者更糟). (3认同)