【问题标题】:skipped trouble with getchar and scanf [duplicate]跳过了 getchar 和 scanf 的麻烦 [重复]
【发布时间】:2015-03-11 00:53:11
【问题描述】:

我最近开始用 C 编程,但我在这段代码中遇到了问题:

#include <stdio.h>
#include <stdlib.h>
#define PI 3.1416

int main () {
    float x;
    int y;

    x = PI;

    printf("Enter y: ");
    scanf(" %i", &y);
    printf("The new value of y is: %i.\n\n",y);

    x = x * y;
    printf("The new value of x is: %f.\n\n",x);


    getchar();
    return 0;
}

问题出现在最后getchar(),程序关闭并且不等待输入。我找到了一个我根本不喜欢的解决方案,即添加 2 次 getchar()。有什么办法吗?我使用的是 ubuntu,所以system("pause") 不是一个选项

【问题讨论】:

  • 需要重复 getchar() 的问题是第一次调用从用户输入的 y 中获取新行。顺便说一句:'Enter y:' 不会告诉用户输入整数,因此用户可以(永远不要相信用户输入的内容)'aaaaaa'。 (或类似的)然后 scanf() 将失败。这意味着应始终检查 scanf 的返回值以确保操作成功(在这种情况下,返回值应为 1)。
  • 'x' 是浮点数,因此 PI 应定义为 '#define PI (3.1416f) 注意末尾的 'f',表示浮点数。否则,这将是一个双精度数,并且编译器必须添加一个转换才能从双精度数转换为浮点数。 '(' 和 ')' 应始终围绕 #defined 数字使用,因此在调用宏时文本替换不会导致不需要/意​​外的代码序列。
  • 这个程序的用户,包括你以后的你,都不知道'x'和'y'的意义,所以用printf语句显示有用的文本,这样用户就会了解正在发生的事情。

标签: c ubuntu scanf getchar


【解决方案1】:

scanf 命令不会使用您在输入y 后按下的 Enter 键。所以getchar() 愉快地消费它。

一种解决方案是在读取y 后消耗输入行的其余部分;代码如下:

int ch; while ( (ch = getchar()) != '\n' && ch != EOF ) {}

虽然还有其他选项可以在程序结束时暂停,但这可能是个好主意,因为如果您以后扩展程序以期望字符串或字符输入,这将是必要的。

【讨论】:

    【解决方案2】:

    这个问题的一个很好的通用解决方案是使用fgets读取用户的输入,然后使用sscanf进行扫描:

    char ln[1024];
    printf("Enter y: ");
    fgets(ln, 1024, stdin);
    sscanf(ln, "%d", &y);
    

    您仍然需要检查fgetssscanf 的返回值是否存在错误情况,但这种方式更容易处理面向行的输入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-11
      • 2013-01-07
      • 2023-03-09
      • 2017-01-11
      相关资源
      最近更新 更多