2017-03-04 70 views
0

我试图从用户那里获取输入,并且fgets正在跳过第一个输入。我知道原因是与fgets是读从以前的声明“\ n”或至少我认为是这样的原因,但我似乎无法修复它C fgets跳过用户输入,即使在刷新缓冲区时

注意,这是一个更大的项目的一部分

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define MAX 1000 

int main(void) { 

    char content[MAX]; 
    char content2[MAX]; 
    char content3[MAX]; 
    char content4[MAX]; 
    char content5[MAX]; 
    char input[4]; 
    char input2[4]; 

    printf("Do you want to continue yes/no?\n"); 
    fgets(input, 4, stdin); 

    if (strncmp (input, "no", 2) == 0) { 
    break; 
    } 
    else if (strncmp (input, "yes", 3) == 0) { 
    fflush(stdin); 

    printf("Country:\n"); 
    fgets(content, MAX, stdin); 

    printf("Province/state: \n"); 
    fgets(content2 ,MAX, stdin); 

    printf("Postal/zip code:\n"); 
    fgets(content3 ,MAX, stdin); 

    printf("Company:\n"); 
    fgets(content4 ,MAX, stdin); 

    printf("Email:\n"); 
    fgets(content5 ,MAX, stdin); 
    } 
+1

这正是发生的情况。最简单的解决方法是增加'input'的大小。你希望在*是/否结束时*调用'fgets'来获取换行符 – StoryTeller

回答

3

"yes"加终止空字符消耗4字节,所以'\n'保留在缓冲区中。将更多缓冲区分配到input,并将其新长度传递到fgets()以读取yes而不在流中留下换行符。

另请注意,fflush(stdin);调用未定义的行为,所以你不应该使用它。

+0

非常感谢你的支持!顺便说一句,我知道这与问题无关,但是你有什么我应该使用而不是fflush的个人建议? – kirkosaur

-2

您是否尝试在fflush中添加stdin?你应该有这样的东西:

fflush(stdin);

+1

不,你不应该。在输入流上调用'fflush'具有未定义的行为。这是可怕的建议。 – StoryTeller

0
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define MAX 1000 

int main(void) { 

    char content[MAX]; 
    char content2[MAX]; 
    char content3[MAX]; 
    char content4[MAX]; 
    char content5[MAX]; 
    char input[4]; 
    char input2[4]; 

    printf("Do you want to continue yes/no?\n"); 
    fgets(input, 4, stdin); 

    if (strncmp (input, "no", 2) == 0) { 
    exit(0); 
    } 
    else if (strncmp (input, "yes", 3) == 0) { 
    fflush(stdin);//this is not portable 
    while(getchar()!='\n');//this thing works 
    printf("Country:\n"); 
    fgets(content, MAX, stdin); 

    printf("Province/state: \n"); 
    fgets(content2 ,MAX, stdin); 

    printf("Postal/zip code:\n"); 
    fgets(content3 ,MAX, stdin); 

    printf("Company:\n"); 
    fgets(content4 ,MAX, stdin); 

    printf("Email:\n"); 
    fgets(content5 ,MAX, stdin); 
    } 
} 

fflush()不适用于大多数情况。请使用以下代码代替

while(getchar()!='\n');