2016-09-17 4 views
1

Je suis nouveau en C, et j'adore apprendre jusqu'à maintenant, mais j'ai rencontré un problème avec mon programme que j'ai du mal à essayer de comprendre. Dans le programme ci-dessous, si l'utilisateur entre «1», il lui sera demandé d'entrer une «clé», un «âge», un «prénom» et un «nom de famille». Cependant, lorsque l'utilisateur entre "1", le programme n'attend pas que l'utilisateur entre une valeur "Clé" et imprime directement "Age".C Le programme n'attend pas que l'utilisateur saisisse une valeur

La sortie après son entrée en « 1 »:

Entrez les informations suivantes: clé: Âge:

Le programme n'attend pas l'utilisateur d'entrer une valeur clé, avant de demander au l'utilisateur à entrer dans une valeur d'âge. Aucune erreur ou avertissement ne se produit lorsque le programme est construit.

Toute aide est grandement appréciée.

typedef struct userInputsContainer { 
    char inputOption[2]; 
    char inputKey[2]; 
    char inputAge[3]; 
    char inputFName[10]; 
    char inputLName[10]; 
}userInputsContainer; 

int main() 
{ 
    struct userInputsContainer* container = (struct  userInputsContainer*)malloc(sizeof(userInputsContainer)); 

    printf("List of options..\n"); 
    printf("1.Create Entry\n2.Search Entries\n"); 
    fgets(container->inputOption, sizeof(container->inputOption), stdin); 

    if(container->inputOption[0] == '1') 
    { 
     printf("\nEnter the following information.. \n"); 

     printf("Key: "); 
     fgets(container->inputKey, sizeof(container->inputKey), stdin); 
     printf("Age: "); 
     fgets(container->inputAge, sizeof(container->inputAge), stdin); 
     printf("First Name: "); 
     fgets(container->inputFName, sizeof(container->inputFName), stdin); 
     printf("Last Name: "); 
     fgets(container->inputLName, sizeof(container->inputLName), stdin); 
    } 
} 
+1

@ user3121023 Il n'est pas nécessaire de stocker un caractère. Qu'en est-il des lignes vides? – Olaf

Répondre

0

Pour la première entrée, lorsque vous lisez dans container->inputOption, le tableau inputOption ont assez d'espace pour adapter un caractère et la fin de chaîne. Le problème est que fgets veut généralement lire le saut de ligne après l'entrée, et l'ajouter au tampon. S'il n'y a pas d'espace dans le tampon, ce qui est le cas ici, alors fgets ne lira simplement pas le retour à la ligne et le laissera dans le tampon d'entrée. Donc, le prochain appel à fgets lira cette nouvelle ligne comme le premier caractère, et pense qu'il est lu toute la ligne et retourne sans rien lire de plus.

Il existe essentiellement deux solutions à ce problème: La première consiste à augmenter la taille du tableau container->inputOption de deux à trois caractères, de sorte qu'il s'adaptera à la nouvelle ligne.

La deuxième solution consiste à avoir une boucle après le premier appel fgets qui lit et rejette les caractères jusqu'à ce qu'il ait lu le saut de ligne.

+0

Merci beaucoup pour l'explication, j'ai définitivement appris quelque chose de nouveau! Cela a résolu mon problème! –