【问题标题】:Why is my for loop only iterating once?为什么我的 for 循环只迭代一次?
【发布时间】:2014-05-01 20:28:21
【问题描述】:

我正在编写一个 Hangman 程序。我的函数处理来自用户的字符猜测时遇到问题。我遇到的问题是我的 for 循环似乎只迭代一次,我不知道为什么。这是一项任务,所以我不要求回复特定的代码,但正确方向的一点会很好。谢谢,功能如下:

void charGuess(char *ch,char *word, int aCount)
{
    char *chr;
    int theResult, i, k, lossCount = 0;
    char aArray[aCount+1];
    char *current;

    for(k=0;k<aCount;k++)
    {
        aArray[k] = '_';
    }

    printf("\nThe char count: %d\n", aCount); //the "aCount" which ive passed in works

    while(1){
        for(i=0; i<aCount; i++) //this loop only iterates once. "aCount" is never 0 when i pass it.
        {
            current = word[i];
            printf("the current char is %c", current);

            if(strcmp(current, ch))
            {
                printf("\ni is: %d\n", i);
                aArray[i] = current;
                printf("%c", aArray[i]);
                displayNewDashes(aCount, aArray);
                break;
            }
            else
            {
                lossCount++;
                hangTheMan(lossCount);
                printf("Loss count: %d", lossCount);
            }
        }
    }
}

【问题讨论】:

  • 你将aCount 的什么值传递给函数?
  • 当你 break 时,你离开了循环......
  • @JoachimPileborg "aCount" 每次运行程序时都会发生变化,因为它是为刽子手生成的随机单词的字符数。
  • 这段代码中错误的数量使循环提前离开的事实相形见绌。您需要查看 C 中的指针是如何工作的。例如:printf("the current char is %c", current); 不正确。就像current = word[i]; 一样,将警告提高到淫秽级别并解决它们将有很大帮助。
  • @Floris 我也试过不使用 break 语句,但它不起作用:(

标签: c for-loop iteration


【解决方案1】:

由于您声明这是一个分配并且您正在寻找指针,因此这里有一些基本的调试步骤。

1) 打开您的编译器能够生成的所有警告,并修复您的代码,直到警告消失。现在上面的产量(使用 gcc):

hang.c:20:21: warning: incompatible integer to pointer conversion assigning to
      'char *' from 'char'; take the address with & [-Wint-conversion]
            current = word[i];
                    ^ ~~~~~~~
                      &
hang.c:21:46: warning: format specifies type 'int' but the argument has type
      'char *' [-Wformat]
            printf("the current char is %c", current);
                                        ~~   ^~~~~~~
                                        %s
hang.c:26:27: warning: incompatible pointer to integer conversion assigning to
      'char' from 'char *'; dereference with * [-Wint-conversion]
                aArray[i] = current;
                          ^ ~~~~~~~

2) 使用调试器单步执行代码。如果您的编译器没有调试器,请获取新的编译器。认真的。

3) 如果您仍然无法弄清楚为什么您的循环不正常,请生成仍然具有意外行为的最小示例。很可能,做一个小例子就会暴露问题。

4) 如果您仍然看不到它,请在您的问题中记录以上所有内容 - 我们很乐意为您提供完成它所需的提示。

【讨论】:

  • 一些提示。在查找字符匹配时不要使用strcmp。将猜测作为char(不是char*)传递,并遍历字符串的所有位置:for(ii=0; ii&lt;aCount; ii++) {if (word[ii]==ch) {// match};
  • ... 或使用strchr,它的作用相同,但输入更少,并且不需要另一个局部变量。
最近更新 更多