而循环在C中不能正常工作

而循环在C中不能正常工作,c,while-loop,scanf,infinite-loop,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

此程序中的循环意外终止失败。当我使用输入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;
    }
}
#包括
int main()
{
int t,flag=0;
chars[2];
scanf(“%d”、&t);
while(t)
{
scanf(“%s”,s);
如果(s[1]=='i')
{
如果(标志==0)
flag=1;
其他的
flag=0;
}
如果(s[1]=='b')
{
}
如果(s[1]=='r')
{
}
printf(“%d\n”,t);
t=t-1;
}
}

数组
s
的大小为2。这意味着它只能容纳一个字符。您输入两个字符,
“qi”
,空终止符写入相邻内存,覆盖其中的任何内容

这将导致未定义的行为。您运气不好,显然覆盖了变量
t
的第一个字节,这将在小型endian机器上将其设置为0(在您的情况下)


解决方案是将字符串扩大到至少3个元素,并将scanf()中的输入限制为最多两个字符。

问题是您正在覆盖超出数组
字符[2]的内存当您使用scanf输入“qi”时,将存储三个字符,即终止零被附加到字符“qi”之后。此终止零覆盖t占用的内存。将阵列s至少放大为

char s[3].
在这种情况下,最好使用for循环,而不是while循环

for ( ; t; --t )

因为很难看到t在while循环结束时被更改。

因为您的字符数组大小为2,并且您的输入字符串“qi”将需要3个字符,包括null,这会导致溢出。因此,您的程序突然终止。

我注意到的一个明显的语法错误是:

printf("%d\n");
应该是

printf("%d\n",t);

因为我假设您希望在每次迭代时打印t的值

@user1336087:不需要有else@OliverCharlesworth同意,已经删除了。正如我所说,拉斯蒂:)是的,你是对的!它正在工作。非常感谢:)