【问题标题】:Why does this for loop run infinitely?为什么这个 for 循环会无限运行?
【发布时间】:2015-10-09 19:31:04
【问题描述】:

我正在尝试一个问题,我必须为以 b 结尾的字符串编写“Accept”。我在处理这部分代码时遇到了问题:

char s[100];
int length,i=0;
gets(s);
length=strlen(s);
for( i=0; i<length; i+2)
{
  if(s[i]=='b' && s[i+1]=='\0')
      printf("Accept");
  else printf("Not accept");
}

但是这个循环无限运行。 当我使用这个时,同样的问题得到了解决:

while(s[i]!='\0')
{ 
   if(s[i]=='b' && s[i+1]=='\0')
      printf("Accept");
   else printf("Not accept");
   i+2;
}

我知道 for 循环的逻辑存在问题,并且已经尝试了很多来解决它,但失败了。我是编程新手。你能帮我解决这个问题吗?

【问题讨论】:

  • 括号有问题
  • while 循环运行良好。
  • 您声称,当您在 while 循环的末尾使用 i+2 时,它运行良好并给出正确的结果?我向你保证不会;它要么根本不进入循环(如果s[i] 的初始值i - 在您的while 示例中两者似乎都未初始化 - 恰好是0)或无限期地留在循环中。至少是i += 2;i = i + 2;
  • 顺便说一句,您假设空字符处于偶数位置
  • @Ed Heal 是的,你是对的。我已经编辑了我的问题以更正代码。

标签: c for-loop infinite-loop


【解决方案1】:
for( i=0; i<length; i+2)

i 不递增。所以应该是:

for( i=0; i<length; i+=2)

【讨论】:

    【解决方案2】:

    您没有在 for 循环中增加 i

    for( i=0; i<length; i+2)
    

    所有这一切都是将 2 加到 i 并丢弃结果。您可能打算增加 2,但这也行不通。如果您的字符串包含偶数个字符,您将永远找不到最后一个字符。

    所以你需要在每次迭代中以 1 递增:

    for( i=0; i<length; i++)
    

    编辑:

    更好的是,只需检查最后一个字符并完全摆脱循环:

    if (s[length-1] == 'b') {
        printf("Accept\n");
    } else {
        printf("Not Accept\n");
    }
    

    【讨论】:

    • 其实这只是部分代码。我想编写一个接受字符串 (ab)*b 的程序。所以,恐怕我不能使用你提供的逻辑。
    • @dj1 如果字符串是(ab)*b,它将被接受。试试看。
    【解决方案3】:

    你在哪里初始化你的字符串?你还缺少括号吗?此外,您可能想打印一次“不接受”。检查下面的解决方案。

    但如果你直接检查数组的最后一个字符是否为'b'(使用索引length-1)实际上会容易得多,并且你不再需要循环(因为你知道长度)。

    #include <stdio.h>
    #include <string.h>
    int main()
    {
      char s[100];
      strcpy(s,"test");
      int length = 0, i = 0, j = 0;
      length=strlen(s);
      for( i=0; i<length; i++)
      {
        if(s[i]=='b' && s[i+1]=='\0')
        {
           printf("Accept");
           j = 1;
        }
    
      }
      if(j==0) printf("Not accept");
      return 0;
    }
    

    【讨论】:

    • strlen 已经完成工作时,为什么还要有一个for 循环?
    • @EdHeal:我在评论中提到过,不是吗?
    • - 抱歉我错过了
    【解决方案4】:

    在您的 for 循环中,您从未增加您的 i 变量:

    for( i=0; i<length; i+2) // should probably use i++ instead of i+2
    

    【讨论】:

    • 我确定他的意思不是我++
    • 如果使用 i++,整个逻辑都会改变。我不是说要使用 i++。我想得到以 b 结尾的字符串,被接受。
    • @dj1:你为什么不直接测试s[length-1]而忘记循环?
    • @Blastfurnace 实际上,这只是代码的一部分。我想编写一个接受字符串 (ab)*b 的程序。所以,恐怕我不能使用你提供的逻辑。
    【解决方案5】:

    您要解决的问题(如果我正确地阅读了尝试)是您想确定最后一个字符是否是字母“b”。

    您已经通过以下方法找到了字符串的长度:

    length=strlen(s);
    

    所以利用这个事实你可以做到以下几点

    if (length > 0 && s[length-1] == 'b') {
       printf("Accept");
    }
    else
    {
       printf("Not accept");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多