2017-03-04 3 views
0

J'essaie d'obtenir des entrées de l'utilisateur et fgets saute la toute première entrée. Je sais que la raison est fgets lit le « \ n » de la déclaration précédente ou du moins je pense que c'est la raison, mais je ne peux pas sembler fixerC fgets ignore l'entrée de l'utilisateur, même lors du vidage du tampon

Notez que cela fait partie d'un projet plus vaste

#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

C'est exactement ce qui se passe. La solution la plus simple serait d'augmenter la taille de 'input'. Vous voulez * que * appelez 'fgets' pour ramasser la nouvelle ligne à la fin de oui/non – StoryTeller

Répondre

3

"yes" plus le caractère nul de fin consomme 4 octets, donc '\n' reste dans le tampon. Allouer plus de tampon à input et passer sa nouvelle longueur à fgets() afin de lire yes sans laisser de caractère de nouvelle ligne dans le flux.

Notez également que fflush(stdin); appelle undefined comportement, donc vous ne devriez pas l'utiliser.

+0

Merci beaucoup qui a fonctionné parfaitement! En passant, je sais que ce n'est pas lié à la question, mais avez-vous une recommandation personnelle sur ce que je devrais utiliser à la place de fflush? – kirkosaur

-2

Avez-vous essayé d'ajouter stdin dans fflush? Vous devriez avoir quelque chose comme ceci:

fflush (stdin);

+1

Non, vous ne devriez pas. L'appel 'fflush' sur les flux d'entrée a un comportement indéfini. C'est terrible conseiller. – 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() ne fonctionne pas la plupart du temps. utilisez le code suivant à la place

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