繁体   English   中英

为什么此C程序输出奇怪的字符?

[英]Why does this c program output strange characters?

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

输出是

在此处输入图片说明

为什么在“ p”之后有奇怪的字符? 他们的意思是什么?

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

这是您的程序知道从哪里停止读取字符串的方式,因为它是一个简单的char数组,不包含长度信息,就像您在c ++等高级语言中所习惯的那样。

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

您还可能尝试分配超出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失败-将其视为随时可能掉下来的定时炸弹-随机发生)。 结合其他答案,您应该可以。

在开始使用数组之前,最好在程序中初始化数组。 这样可以避免在这种情况下打印垃圾字符。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM