虽然循环在C中不能正常工作

时间:2014-11-09 18:28:13

标签: c while-loop scanf infinite-loop

此程序中的循环意外终止。当我使用输入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;
    }
}

4 个答案:

答案 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的值。