【问题标题】:for-loop and getchar() in CC 中的 for 循环和 getchar()
【发布时间】:2016-01-22 23:45:50
【问题描述】:

为什么代码偶数次直接获取空数据?我不知道发生了什么。 非常感谢。

    #include <stdio.h>
    #pragma warning(disable : 4996) 
    
    void main() {
        
        int f, a = 10, b = 20;
        for (int i = 0; i < 5; i++)
        {
            char ch;
            ch = getchar();
            printf("ch = %c\n", ch);
            switch (ch)
            {
                case '+': f = a + b; printf("f = %d\n", f); break;
                case '−': f = a - b; printf("f = %d\n", f); break;
                case '*': f = a * b; printf("f = %d\n", f); break;
                case '/': f = a / b; printf("f = %d\n", f); break;
                default: printf("invalid operator\n"); 
            }
    
        }
    
    }

如果我输入一个运算符,它会循环两次。第二次是空输入。

【问题讨论】:

  • 请详细说明什么不工作,以及预期的结果是什么
  • 每次输入任何算子都会显示如下信息。 "ch = 无效运算符"
  • 其他说明:1) 使用int main(void) 2)ch 应该是int

标签: c for-loop getchar


【解决方案1】:

假设您输入了a,然后输入了 Enter

第一次调用getchar() 返回a,但换行符仍留在输入流中。对getchar() 的下一次调用将返回换行符,而无需等待您的输入。

有很多方法可以解决这个问题。最简单的方法之一是在调用 getchar() 之后忽略该行的其余部分。

ch = getchar();

// Ignore the rest of the line.
int ignoreChar;
while ( (ignoreChar = getchar()) != '\n' && ignoreChar != EOF );

您可以将其包装在一个函数中。

void ignoreLine(FILE* in)
{
   int ch;
   while ( (ch = fgetc(in)) != '\n' && ch != EOF );
}

并使用

ch = getchar();

// Ignore the rest of the line.
ignoreLine(stdin);

【讨论】:

    【解决方案2】:

    如果您不想对代码进行太多更改,我建议您在 for 循环的末尾插入另一个 getchar 以使用 '\n':

    #include <stdio.h>
    #pragma warning(disable : 4996) 
    
    void main() {
    
        int f, a = 10, b = 20;
        for (int i = 0; i < 5; i++)
        {
            char ch;
            ch = getchar();
            printf("ch = %c\n", ch);
            switch (ch)
            {
                case '+': f = a + b; printf("f = %d\n", f); break;
                case '−': f = a - b; printf("f = %d\n", f); break;
                case '*': f = a * b; printf("f = %d\n", f); break;
                case '/': f = a / b; printf("f = %d\n", f); break;
                default: printf("invalid operator\n"); 
            }
            getchar();
    
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-04
      • 2023-04-10
      • 1970-01-01
      • 2010-10-07
      • 2012-06-02
      • 2013-11-05
      • 2018-02-06
      相关资源
      最近更新 更多