【问题标题】:While loop not working properly in CWhile循环在C中无法正常工作
【发布时间】:2015-01-06 01:01:13
【问题描述】:

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

【问题讨论】:

  • @user1336087: else 没必要
  • @OliverCharlesworth 同意,已将其删除。正如我所说,生锈:)

标签: c while-loop scanf infinite-loop


【解决方案1】:

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

这将导致未定义的行为。你很不幸,显然覆盖了变量t 的第一个字节,这将在一个小端机器上将它设置为0(在你的情况下)。

解决办法是把字符串放大到至少3个元素,并限制scanf()中的输入最多两个字符。

【讨论】:

  • 是的,你是对的!它现在正在工作。非常感谢:)
【解决方案2】:

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

char s[3].

在这种情况下,最好使用 for 循环而不是 while 循环

for ( ; t; --t )

因为很难看出 t 在 while 循环结束时发生了变化。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      printf("%d\n");
      

      应该是

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-30
        • 1970-01-01
        • 2012-02-19
        • 2014-12-06
        • 2023-03-25
        相关资源
        最近更新 更多