[英]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循环将i
从98
递增到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.