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

时间:2014-08-07 02:23:35

标签: c

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

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

输出

enter image description here

“p”之后为什么会出现奇怪的字符?他们是什么意思?

3 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:0)

您还可能尝试在声明的s范围之外分配值。您定义s[100],可在s[0]s[99]为您提供100个字符。您的代码可以尝试分配未定义的s[100]。具体来说:

for(i=0;i<100-1&&(c=getchar())!=EOF&&c!='\n';++i)
    s[i]=c;

for循环将i98增加到99,并以i=99结束。 (即i不再小于100-1,因此循环终止于该子句。)看看接下来会发生什么。如果c是换行符,则指定s[99]='\n'并将i (++ i)增加到100

if(c=='\n'){ 
    s[i]=c;
    ++i;
}

还可以,但您无法再次分配s[i]。然后,您可以指定s[100]='p';。的 KABOOM!

s[i]='p';

(现在每次都没有用kaboom失败 - 把它想象成随时可能随时发生的定时炸弹 - 随机发生)。将此与其他答案相结合,您应该没问题。

答案 2 :(得分:0)

在开始使用之前,最好先在程序中初始化数组 数组。这将避免在这些类型的情况下打印垃圾字符。

bzero(s,sizeof(char)* 100);