用getchar和scanf跳过了麻烦

时间:2015-03-11 00:53:11

标签: c ubuntu scanf getchar

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

2 个答案:

答案 0 :(得分:2)

scanf命令不会使用您在输入y后按下的Enter键。所以getchar()很乐意消耗它。

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

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

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

答案 1 :(得分:1)

此问题的一般解决方案是使用fgets读取用户的输入,然后使用sscanf进行扫描:

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

对于错误条件,您仍需要检查fgetssscanf的返回值,但这样更容易处理面向行的输入。