【问题标题】:C is stuck in a infinite loopC陷入无限循环
【发布时间】:2013-11-20 15:28:06
【问题描述】:

我有一个简单的程序,我想自己测试它,它基本上从终端字符中读取并计算输入了多少小写字符。

在我调用的函数中,它似乎只是在循环中永远运行。

/*
Create a function that reads the number of lower case letters from the user
*/

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

void CopyMe(char []);

main ()
{
    char letters [100];
    int i = 0;
    do
    {
        letters [i++] = getchar();
    }
    while (letters [i-1] != '\n');
    letters [i-1] = '\0';

    CopyMe(letters);

    printf("Done \n");
    system("pause");
    return 0;
}

void CopyMe(char a[])
{
    int lowercase = 0;
    int i=0;
    while ( a[i] != '\0')
    {
        if (a[i] >= 'a' && a[i] <= 'z')
        {
            lowercase++;
        }
    }
    printf("Lowercase: %d \n", lowercase);
}

【问题讨论】:

  • 使用调试器单步执行循环。原因应该很快就会清楚。
  • for (i=0; i&lt;MAX; i++) { .. } 不会出错。
  • 任何时候循环似乎“永远运行”,您最好检查循环的条件并确定循环体内是否有任何东西会改变它。
  • 我的猜测在这里:while (letters [i-1] != '\n');
  • while 我有时会使用while 循环,我的同事(还有我自己,for)发现for 循环更易于阅读、维护、理解和,作为一个构造,一个更好的工具for避免愚蠢的错误......使用for(i=0;a[i] != '\0';++i),或者,如果你坚持,为什么不增加指针a++?

标签: c loops terminal


【解决方案1】:

您永远不会在 CopyMe 函数中增加 i,因此 while 循环永远不会终止,始终在 a[0] 上工作。

【讨论】:

    【解决方案2】:

    你忘了增加 i 变量...

    【讨论】:

    • 在 CopyMe 中......只需使用 for 循环 ffs
    【解决方案3】:

    您没有在CopyMe 中增加i:

    void CopyMe(char a[])
    {
        int lowercase = 0;
        int i=0;
        while ( a[i] != '\0')
        {
            if (a[i] >= 'a' && a[i] <= 'z')
            {
                lowercase++;
            }
            i++; // <------- Don't forget about meeeeeee!!!
        }
        printf("Lowercase: %d \n", lowercase);
    }
    

    【讨论】:

      猜你喜欢
      • 2015-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-13
      相关资源
      最近更新 更多