我要求使用fgets从函数输入。我不断收到一个烦人的错误,程序跳过输入并转到第二个变量的输入。我不知道这似乎是什么问题。有问题的代码如下。它从getchar()读取,如果是'n',它将成为第二个函数。
#include <stdio.h>
void enter(){
char name[20];
int Age;
float Highbp;
float Lowbp;
printf("name: ");
fgets(name, 20, stdin);
printf("age: ");
scanf("%d", &Age);
printf("high bp: ");
scanf("%f", &Highbp);
printf("low bp: ");
scanf("%f", &Lowbp);
return ;
}
void option(){
char choice = getchar();
if(choice == 'n'){
enter();
}
}
int main(int argc, char **argv)
{
option();
}
输出(不是整个输出):
>n
>name: age:
现在可以使用
printf("name: ");
while(getchar()!='\n');
fgets(name, 20, stdin);
答案 0 :(得分:4)
我没有运行你的代码所以我只能猜测。这听起来很熟悉:
程序跳过输入 并转到第二个输入 变量
与这些问题有关:
第一次扫描后的输入流 呼叫仍然包含\ n ,所以 得到电话立刻读取它,没有 暂停你输入任何东西 更多。问题在于获得 呼叫满足其输入的需要 一种意想不到的方式
所以它可能是某个地方的剩余\n
。
我重新阅读了您的代码,我相信您的问题是:
char choice = getchar(); /* leaves a \n in the buffer */
答案 1 :(得分:3)
那是因为stdin缓冲区中有一个缓冲的换行符。要删除它,请使用:
fflush(stdin);
所以你的代码现在是这样的:
#include <stdio.h>
void enter(){
char name[20];
int Age;
float Highbp;
float Lowbp;
printf("name: ");
fflush(stdin);
fgets(name, 20, stdin);
printf("age: ");
scanf("%d", &Age);
printf("high bp: ");
scanf("%f", &Highbp);
printf("low bp: ");
scanf("%f", &Lowbp);
return ;
}
void option(){
char choice = getchar();
if(choice == 'n'){
enter();
}
}
int main(int argc, char **argv)
{
option();
}
<强>被修改强>
因为,这里的每个人都说不鼓励使用fflush(stdin);
(虽然它每次都适合我。:))
这是另一种解决方案。而不是fflush(stdin)
使用:
while(getchar()!='\n');
这将清空可能跳过下一个fgets调用的换行缓冲区。