跳过 getchar 和 scanf 的麻烦

skipped trouble with getchar and scanf

我最近开始用 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") 不是一个选项

scanf 命令不会消耗您在输入 y 后按下的回车键。所以 getchar() 愉快地消费了它。

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

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

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

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

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

您仍然需要检查 fgetssscanf 的 return 值以了解错误情况,但以这种方式处理面向行的输入更容易。