2017-09-27 3 views
0

J'essaie de créer un petit programme de carnet d'adresses en C où les utilisateurs entreraient les informations de contact qui sont stockées dans un fichier texte. Si un utilisateur choisit d'ajouter un nouveau contact, le programme devrait lui demander s'il souhaite en ajouter un autre lorsqu'il aura terminé. J'ai fait une instruction if qui, selon moi, devrait terminer la boucle si elles entrent dans 'n' ou continuer pour un autre contact si elles écrivent quelque chose d'autre. Cependant si l'utilisateur tape 'y' (ou n'importe quoi d'autre), il sort toujours après seulement 1 boucle.Do Tandis que la boucle se termine toujours après la première boucle

void new_contact(void){ 
    printf("Ready for new contact\n"); 
    int enter_new_contact = 1; 
    char first_name[15]; 
    char second_name[20]; 
    char phone_number[12]; 
    char email[50]; 
    char y_n[1]; 
    do{ 
     printf("Enter the contacts first name.\n"); 
     scanf("%s", first_name); 

     printf("Enter the contacts second name.\n"); 
     scanf("%s", second_name); 

     printf("Enter the contacts phone number.\n"); 
     scanf("%s", phone_number); 

     printf("Enter the contacts email.\n"); 
     scanf("%s", email); 

     printf("%s\t%s\t%s\t%s\n", first_name, second_name, phone_number, email); 

     printf("Would you like to add another contact?\n"); 
     scanf("%s", y_n); 
     printf("%s\n", y_n); 

     if(strcmp(y_n, "n")==0){ 
      enter_new_contact=0; 
     } 

    }while(enter_new_contact==1); 
} 

Merci d'avance!

+4

Première chose: fixer un comportement non défini, comme 'char y_n [1], 'étant pas assez grand pour contenir un caractère et un terminateur null. –

+1

'char y_n [1];': ce tampon char est trop petit. Il ne peut pas contenir de chaîne sensible. Vous avez besoin d'espace pour le terminateur null. Et que se passe-t-il lorsque l'utilisateur entre "oui" ou "non"? –

Répondre

4
scanf("%s", y_n); 

Vous avez un comportement non défini ici quand scanf() tente de mettre en '\0'y_n, auquel vous ATTRIBUE un seul caractère. Vous devriez plutôt déclarer comme

char y_n[2]; 

et modifier l'instruction scanf à

scanf("%1s", y_n); 
+0

Pourquoi pas simplement 'char y_n' à la place? – CinCout

+1

@CinCout: Numérisation des caractères a le problème que chaque caractère est considéré. Il y a des tas de questions où le saut de ligne est lu au lieu du caractère voulu. La méthode ci-dessus qui limite la lecture à un caractère a aussi des problèmes: Lorsque l'utilisateur entre "oui", ce qui est une réponse raisonnable à la question, seulement le "y" sera scanné et le prénom du contact suivant sera "es" . 'scanf' n'est pas vraiment adapté à l'entrée interactive, à mon avis. –