【问题标题】:Why does my for loop not give intended output in C? [duplicate]为什么我的 for 循环在 C 中没有给出预期的输出? [复制]
【发布时间】:2017-11-08 13:50:39
【问题描述】:

我正在尝试向我在 for 循环中定义的数组添加一个字母。对于用户每次输入内容,我想将“counterSoFar”减 1,并显示它。但是,“counterSoFar”总是减少 2 并跳过用户输入任何内容的机会,而不是将“counterSoFar”减少 1。我尝试多次查看代码,但我仍然无法弄清楚为什么。请指教。

# include <stdio.h>
# include <ctype.h>
void userInput(char[]);

int main() {
    printf("Player 1 please enter a word of up to 12 letters.\n");
    char word[13];
    scanf("%13s", word);
    userInput(word);
}
void userInput(char word[])
{
    int n = strlen(word);
    for (int i = 0; i < n; i++)
    {
        word[i] = tolower(word[i]);
    }

    int checker;
    for (int i = 0; i < n; i++)
    {

        if (isalpha(word[i]))
        {
            checker = 1;
        }
        else
        {
            checker = 0;
            printf("Please enter a word without spaces and numbers!\n");
            break;

        }
    }
    if (checker == 1)
    {
        int counterSoFar = 8;
        char letter[1];
        printf("The word to guess is as follows: \n");
        for (int i = 0; i < n; i++)
        {
            printf("_");
        }
        int maxTries = 7;
        for (int guessCounter = 0; guessCounter < maxTries; guessCounter++)
        {
            printf("\n");
            counterSoFar = counterSoFar - 1;
            printf("You have %d tries left!\n\n", counterSoFar);

            printf("Player 2 please enter only 1 letter!\n");
            scanf("%c", &letter);
            char array[13];
            for (int c = 0; c < n; c++)
            {
                if (letter == word[c])
                {
                    array[c] = word[c];
                }
                else
                {
                    array[c] = '_';
                }
            }
            printf("The current array is %c", array);

        }


        }


}

【问题讨论】:

  • -scanf("%c",&letter);
  • 双倍递减是由 stdin 中的尾随换行符引起的。请阅读stackoverflow.com/questions/35178520/…
  • 它不负责你问的问题,但是要打印数组array,你必须使用%s字段描述符(不是%c,它是针对单个字符的),并且您必须确保该数组包含一个字符串终止符。
  • 另外,我建议避免冗余。当maxTriesguessCounter(一起)已经携带相同的信息时,为什么要创建和管理变量counterSoFar。也就是说,我建议不要使用printf("You have %d tries left!\n\n", counterSoFar);,而是完全放弃counterSoFar 并使用printf("You have %d tries left!\n\n", maxTries - guessCounter);

标签: c arrays loops for-loop counter


【解决方案1】:
  • scanf("%c",&amp;letter);

  • 此外,您还将获得 \n 作为另一个输入。所以使用scanf(" %c",&amp;letter); 来消耗\n

如果你考虑一些事情:-

  1. maxTries 是您希望保留在 for 循环之外的内容。你可能会问为什么?但问题是它有助于保留程序以后可能需要的东西,并且提高了可读性。

  2. 第二件事是,如果您使用的是counterSoFar,那么我猜它是由某些东西启动的。这再次支持我的第一点。您不需要在循环中重新初始化maxTries


作为对您评论的回答,您做错了很多事情。我会一一尝试。

  • char word[13]; 用于 12 个字符和一个空终止字符 \0

scanf("%12s",word);

  • 应该是char letter 而不是char letter[1]。为什么要使用 1 大小的 char 数组而不是一个字符?

  • char array[13]; 应该退出for 循环以保留已经猜到的字符。

  • 您应该初始化它而不是字母字符,以区分哪些正在填充哪些没有。

这是一个结合更正的小例子:-(如果您尝试在其中合并其他游戏逻辑会更好......我已经展示了一个最低限度的部分)。


#include <stdio.h>
#include <ctype.h> 
#include  <string.h>
void userInput(char[]);
int main() {
    printf("Player 1 please enter a word of up to 12 letters.\n");
    char word[13];
    scanf("%12s", word);
    userInput(word);
}
void userInput(char word[])
{
    int n = strlen(word);
    for (int i = 0; i < n; i++)
        word[i] = tolower(word[i]);


    char letter;
    printf("The word to guess is as follows: \n");
    for (int i = 0; i < n; i++)
        printf("_ ");

    char array[13]={0};
    for(int i=0;i<=11;i++)
        array[i]='_';
    int maxTries = 16;
    int matched = 0;
    for (int guessCounter = 0; guessCounter < maxTries; guessCounter++)
    {
        printf("\n");
        printf("You have %d tries left!\n\n", maxTries - guessCounter);

        printf("Player 2 please enter only 1 letter!\n");
        scanf(" %c", &letter);

        for (int c = 0; c < n; c++)
        {
            if (letter == word[c] && array[c]=='_')
            {
                matched++;
                array[c] = letter;
                break;
            }

        }
        if( matched == n){
            printf("You won!!!!");
            return;
        }
        printf("The current array is ");
        for(int i=0;i<n;i++)
            printf("%c ",array[i]);

    }
    printf("You lose!!!!");

}

【讨论】:

    【解决方案2】:

    改第一个正确的是

    printf("Player 2 please enter only 1 letter!\n");
            scanf("%c", &letter);
    

    【讨论】:

      【解决方案3】:

      你需要更改语句:

      scanf("%c", letter);
      

      到:

      scanf(" %c", &letter);
      

      因为scanf 需要一个指针作为参数,所以你应该传递变量的地址。需要 %c 说明符之前的空格来消耗输入之间的 \n

      【讨论】:

        猜你喜欢
        • 2012-08-31
        • 1970-01-01
        • 2012-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-18
        • 1970-01-01
        相关资源
        最近更新 更多