此程序中的循环意外终止。当我使用输入t = 4和s =" qi"进行测试时,程序运行时打印的t值为0而不是预期值4.出了什么问题?
#include<stdio.h>
int main()
{
int t,flag=0;
char s[2];
scanf("%d ",&t);
while(t)
{
scanf("%s",s);
if(s[1]=='i')
{
if(flag==0)
flag=1;
else
flag=0;
}
else if(s[1]=='b')
{
}
else if(s[1]=='r')
{
}
printf("%d\n",t);
t=t-1;
}
}
答案 0 :(得分:2)
数组s
的大小为2.这意味着它只能容纳一个字符。您输入两个字符"qi"
,并且空终止符写在相邻的内存中,覆盖其中的任何内容。
这将导致未定义的行为。你运气不好,显然已经覆盖了变量t
的第一个字节,它会在一个小端机器上将其设置为0(在你的情况下)。
解决方案是将字符串放大到至少3个元素,并将scanf()中的输入限制为最多两个字符。
答案 1 :(得分:0)
问题是你要在数组char s[2];
之外覆盖内存当你输入&#34; qi&#34;使用scanf然后存储三个字符,终止零被附加到字符&#34; qi&#34;。该终止零覆盖t占用的内存。至少将数组放大为
char s[3].
在这种情况下,使用for循环然后使用while循环
会更好for ( ; t; --t )
因为很难看到t在while循环结束时被改变了。
答案 2 :(得分:0)
由于您的字符数组大小为2,输入字符串“qi”将需要包含null的3个字符,这会导致溢出。因此,您的程序会突然终止。
答案 3 :(得分:0)
我注意到的一个明显的语法错误是:
printf("%d\n");
应该是
printf("%d\n",t);
因为我假设您希望在每次迭代时打印t的值。