【问题标题】:for loop runs twice in Cfor 循环在 C 中运行两次
【发布时间】:2014-04-20 06:09:56
【问题描述】:

我是 C 编程新手。我在做一个练习,问题是这样的:使用 ?: 运算符和 for 语句编写一个程序,该程序不断获取用户输入的字符,直到字符 q 被计算在内。

这是我写的程序:

#include <stdio.h>

main()
{
    int x, i=0;
    for (x = 0; x == 'q'? 0 : 1; printf("Loop %d is finished\n",i))
    {
        printf("Enter q to exit!!!\n");
        printf("Please enter a character:\n");
        x=getc(stdin);
        putc(x,stdout);
        ++i;
    }
    printf("\nThe for loop is ended. Bye!");

    return 0;       
}

问题是:每次我输入一个“非q”字符时,循环似乎都会运行两次。 我不知道我的程序有什么问题。 请帮忙!

【问题讨论】:

  • 似乎您需要清除输入缓冲区,因为我认为您正在阅读换行符。

标签: c


【解决方案1】:

当你输入一个非q的字母时,你也按下了Enter,它在第二个循环中被读取。

要使循环在每个输入中只运行一次,请使用fgets() 一次读取整行输入,并检查输入字符串是否符合您的预期。

【讨论】:

  • 那么如何让它只运行一次呢?
  • 换句话说,getc(stdin); 有两个字符可以读取,它就完成了它的工作!
  • fgets阅读整行。
  • 您可能想通过scanf and fgets阅读有关安全性的信息。
  • 或者,看看getc 是否得到\n 并在这种情况下再做一次getc。并处理EOF
【解决方案2】:

当您键入a 然后按Enter 时,换行符将成为stdin 流的一部分。读取a后,下次执行x=getc(stdin)时,x的值设置为\n。这就是循环执行两次迭代的原因。

【讨论】:

    【解决方案3】:

    循环运行两次,因为当您输入非q 字符时,您实际上输入了两个字符 - 非q 字符和换行符'\n' 字符。 x = getc(stdin);stdin 流中读取非q 字符,但换行符仍位于stdin 的缓冲区中,该缓冲区将在下一次getc 调用中读取。

    您应该按照其他人的建议使用fgets 从流中读取一行,然后您可以处理该行。此外,您应该将main 的返回类型指定为int。我建议进行以下更改 -

    #include <stdio.h>
    
    int main(void)
    {
        int x, i = 0;
    
        // array to store the input line
        // assuming that the max length of
        // the line is 10. +1 is for the 
        // terminating null added by fscanf to
        // mark the end of the string
        char line[10 + 1];
    
        for (x = 0; x == 'q'? 0 : 1; printf("Loop %d is finished\n", i))
        {
            printf("Enter q to exit!!!\n");
            printf("Please enter a character:\n");
    
            // fgets reads an input line of at most 
            // one less than sizeof line, i.e., 
            // 10 characters from stdin and saves it 
            // in the array line and then adds a 
            // terminating null byte
            fgets(line, sizeof line, stdin);
    
            // assign the first character of line to x
            x = line[0];
            putc(x, stdout);
            ++i;
        }
        printf("\nThe for loop is ended. Bye!");
    
        return 0;       
    }
    

    【讨论】:

      【解决方案4】:

      当你输入一个字符时,说'x'并按下回车,你实际上输入了两个字符,'x'和'\n'也被称为换行符(当你按下回车时)。 '\n' 成为输入流的一部分,并且也为其执行循环。

      另外,尝试输入“xyz”并回车,循环将执行 4 次。对于每个“x”、“y”、“z”和“\n”。

      如果您希望代码为每个输入工作一次,请使用函数 gets。

      #include <stdio.h>
      
      main()
      {
          int i=0;
          char x[10];
          for ( ; x[0]!='q'; printf("Loop %d is finished\n",i) )
          {
              printf("Enter q to exit!!!\n");
              printf("Please enter a character:\n");
              gets(x);
              i++;
          }
          printf("\nThe for loop is ended. Bye!");
      
          return 0;
      }
      

      在这段代码中,我们将 x 声明为一个字符串,gets() 函数读取我们输入的整行,然后在 for 循环的条件部分,我们检查字符串的第一个字符是否为 'q' .

      【讨论】:

        猜你喜欢
        • 2021-11-21
        • 2016-02-22
        • 1970-01-01
        • 1970-01-01
        • 2020-03-18
        • 2018-06-25
        • 1970-01-01
        • 2013-05-02
        • 1970-01-01
        相关资源
        最近更新 更多