以下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);
}
输出
“p”之后为什么会出现奇怪的字符?他们是什么意思?
答案 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循环将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失败 - 把它想象成随时可能随时发生的定时炸弹 - 随机发生)。将此与其他答案相结合,您应该没问题。
答案 2 :(得分:0)
在开始使用之前,最好先在程序中初始化数组 数组。这将避免在这些类型的情况下打印垃圾字符。
bzero(s,sizeof(char)* 100);