【问题标题】:getchar() function not reading the correct valuegetchar() 函数没有读取正确的值
【发布时间】:2013-11-11 20:43:10
【问题描述】:

当我输入 0 时,程序结束。但是if语句中有getchar(),它不起作用,你能帮帮我吗?

在案例 0 中,我希望它从用户那里获取字符。如果输入'N''n',程序将结束,否则程序将重新开始。 (来自 sec1)。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n;

    sec1:
    printf("Select a number between 4 and 0: ");
    scanf("%d[\n]", &n);

    switch(n)
    {
        case 0:
            puts("Are you sure?");
            puts("Yes(Y) or No(N)");
            if(getchar() == 'N') goto sec1;
            break;

        case 1:
            break;
        case 2:
            break;
        case 3:
            break;
        case 4:
            break;

        default:
            puts("Only numbers between 4 and 1 are accepted!");
            goto sec1;
            break;

    }
    system("pause");
    return 0;
}

工作一个

int main()
{
    int n, c;

    sec1:
    printf("Select a number between 4 and 0: ");
    scanf("%d/n", &n);

    switch(n)
    {
        case 0:
            puts("Are you sure?");
            puts("Yes(Y) or No(N)");
            fflush(stdin);
            if (getchar() == 'N') goto sec1;
            break;

        case 1:
            break;
        case 2:
            break;
        case 3:
            break;
        case 4:
            break;

        default:
            puts("Only numbers between 4 and 1 are accepted!");
            goto sec1;
            break;

    }
    system("pause");
    return 0;
}

【问题讨论】:

  • 你为什么使用goto?只需使用一个循环。
  • 提示:如果按“N”或“n”,它的行为会有所不同吗?
  • 实际上条件是 if(getchar()=='N' || getchar()=='n') 但我做不到
  • @user2588276:如果这是实际情况,你为什么要向我们展示不同的东西?向我们展示真实的代码。它不起作用,因为有两次对getchar() 的调用。如果您要多次查看getchar() 的结果,请将其分配给一个变量并查看该变量:int c; c = getchar(); if (c == 'N' || c == 'n') ...
  • 我说它是*编辑:它也不能按照你说的方式工作,它仍然在不询问用户字符的情况下结束

标签: c scanf getchar


【解决方案1】:

改变

scanf("%d[\n]",&n);

scanf("%d\n",&n);

您的原始代码不起作用的原因是因为 scanf 想要读取一个整数、一个“[”、一个“\n”和一个“]”。因此,当您输入一个整数后跟一个“\n”时,scanf 只接受整数(因为它希望看到一个“[”)。然后 getchar 将简单地获取剩余的“\n”。这就是为什么您的 getchar() 似乎不起作用的原因。

希望对你有帮助!

【讨论】:

  • 谢谢你解决了问题。想知道为什么我的不工作。我写它是为了避免使用 scanf 换行符。无论如何谢谢
  • 问题是 scanf 的换行符。这个可以避免它,但是在第二次输入后会显示 put,真的很混乱
  • 大家好。谢谢!我添加了一些解释!
【解决方案2】:

当您读取“N”或“n”时,输入缓冲区中可能有一些符号。您需要在新读取之前刷新输入缓冲区。详情请见this question

简单地写: while (getchar() != '\n') {}scanf(...) 之后。

【讨论】:

    【解决方案3】:

    我猜这是处于熟化模式的终端,因此仅当用户通过按回车键完成一行时才将键入的字符输入程序。您可以通过从管道输入而不是从终端以交互方式输入来测试它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-08
      • 1970-01-01
      • 2021-11-04
      • 2022-08-11
      • 2020-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多