【问题标题】:Unexpected input when using getchar()使用 getchar() 时出现意外输入
【发布时间】:2025-12-13 15:35:02
【问题描述】:

我正在创建一个程序,如果我输入的字符返回 true 是一个大写字母,当我输入字符“0”时循环停止。代码如下:

#include <stdio.h>

int main (void)
{
    char c;
    do 
    {
        printf ("Please enter character to check if uppercase: ");
        c = getchar ();

        if ( (c >= 'A') && (c <= 'Z') )
        {
            printf ("true\n");
        }
        else
        {
            printf ("false\n");
        }
    } while ( c != '0');


    return 0;
}

但是,我得到了奇怪的行为(输出):

请输入字符以检查是否大写:a

请输入字符检查是否大写:false

请输入字符检查是否大写:b

请输入字符检查是否大写:false

请输入字符以检查是否大写:A

是的

请输入字符检查是否大写:false

请输入字符检查是否大写:0

- 提示后出现的“错误”不是我输入的。 例如:

  • 1。出现提示
  • 2。我输入字符'a'
  • 3。控制台打印错误
  • 4。提示出现但也打印了提示旁边的“假”字样
  • 5。提示再次出现

所以看起来 getchar() 正在接受不是来自我的输入。 有什么想法吗?

【问题讨论】:

  • 你反复提到scanf,但你的代码只使用getchar。请在您的问题中更加小心,以免让回答者感到困惑。
  • @ChrisHayes SO 允许您编辑其他人的问题。正如您所指出的,由于代码仅使用 getchar() 进行输入,因此我编辑了问题以将提到的 scanf() 替换为 getchar()
  • getchar的返回类型是int,你应该把它存入一个int类型的变量中,并与EOF比较;另见what happens if you use char c = getchar() instead of int

标签: c getchar


【解决方案1】:

您没有处理换行符。

请参阅this 答案以获得澄清。

【讨论】:

    【解决方案2】:

    getchar() 留下一个换行符,在下一次迭代中使用。添加另一个 getchar() 以忽略换行符:

    c = getchar ();
    getchar(); // To consume the newline
    

    或者读出所有直到换行符:

    int c=0;
    while ((c = getchar()) != '\n' && c != EOF) ;
    

    【讨论】:

    • 这是正确的,但如果下一个字符不是换行符会有些危险。如果要保留非换行符,可以使用ungetc。 (例如,如果用户输入 'aaa\n'。)
    • @ChrisHayes ungetc() 保证只推回字符。所以这也不安全。 getchar()、scanf() 都以一种或另一种方式容易出错。我建议使用 fgets() + sscanf()。但这似乎有点过头了。
    • 我不明白你的意思。 ungetc 在这种情况下是完全安全的,因为您应该只需要一次推回一个字符。也就是说,使用getchar 弹出一个字符,如果它不是换行符,则使用ungetc 并继续循环。