而循环在C中不能正常工作
此程序中的循环意外终止失败。当我使用输入t=4和s=“qi”进行测试时,程序运行时打印的t值为0,而不是预期值4。怎么了而循环在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
#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同意,已经删除了。正如我所说,拉斯蒂:)是的,你是对的!它正在工作。非常感谢:)