2009-10-01 9 views
2

J'ai un programme écrit en C et il appelle gets() à partir d'un commutateur quand un utilisateur choisit l'option 3. Voici mon code. Il ne semble pas attendre d'attendre que l'utilisateur saisisse quelque chose. Au contraire, le programme continue dans le commutateur.gets() ne fonctionne pas

void getField(); 

#include <stdio.h> 
#include <string.h> 
/*#include "stubs.c" 
#include "record.h" */ 

int debugMode; 

void getField(){ 
    char name[25]; 
    char address[80]; 
    int yearofbirth; 
    char telno[15]; 
    int counter = 0; 

    if(debugMode == 1){ 
     printf("***DEBUG*** Entering getField function \n"); 
    } 

    printf("Enter your name:"); 
    gets(name); 

    printf("Name: %s \n", name); 
    printf("\n"); 
} 

void main(int argc, char * argv[]) 
{ 
    struct record* start = NULL; 
    int userChoice; 
    debugMode = 0; 

    if(argv[1] != NULL){ 
     if((strcmp(argv[1], "debug") == 0) && (argv[2] == NULL)){ 
      debugMode = 1; 
      printf("Welcome, to the personal address book application \n"); 
     } 
     else{ 
      int i = 0; 
      while(argv[i] != NULL){ 
       printf(argv[i]); 
       printf(" "); 
       i++; 
      } 
      printf(": Command not found \n"); 
      userChoice = 6; 
     } 
    } 

    if(argv[1] == NULL){ 
     printf("Welcome, to the personal address book application \n"); 
     userChoice = 0; 
    } 


    while(userChoice != 6) 
    { 
     if(debugMode == 1){ 
      printf("***DEBUG*** Entering do-while loop \n"); 
     } 

     printf("Enter number corresponding number to option below \n\n"); 

     printf("1) Add a new record in the database \n"); 
     printf("2) Modify a record in the database \n"); 
     printf("3) Print information about a record in the database \n"); 
     printf("4) Print all information in the database \n"); 
     printf("5) Delete an existing record from the database \n"); 
     printf("6) Quit program \n\n >"); 


     scanf("%d", &userChoice); 

     switch(userChoice){ 

      case 1: 
       /*addRecord(start, arrayHolder, arrayHolder, 0, arrayHolder); 
       */userChoice = 0; 
       break; 
      case 2: 
       /*modifyRecord(start, arrayHolder, arrayHolder, arrayHolder); 
       */userChoice = 0; 
       break; 
      case 3: 
       /*printRecord(start, arrayHolder); 
       */userChoice = 0; 
       getField(); 
       break; 
      case 4: 
       /*printAllRecords(start); 
       */userChoice = 0; 
       break; 
      case 5: 
       /*deleteRecord(start, arrayHolder); 
       */userChoice = 0; 
       break; 
      case 6: 
       printf("case 6 \n"); 
       break; 
      default: 
       printf("default \n"); 
       userChoice = 0; 
       break; 
     } 

    } 
    printf("\n"); 
} 
+3

Premier problème: vous appelez gets(). – Joshua

Répondre

-1

Ajoutez un "\ n" à la ligne scanf! lit la chaîne vide et le CR après votre choix.

scanf("%d\n", &userChoice); 

Et dans GetField(), après printf, dites "fflush":

void getField(){ 
    char name[25]; 
    char address[80]; 
    int yearofbirth; 
    char telno[15]; 
    int counter = 0; 

    if(debugMode == 1){ 
     printf("***DEBUG*** Entering getField function \n"); 
    } 

    printf("Enter your name:"); 
    fflush(stdout); 
    gets(name); 

    printf("Name: %s \n", name); 
    fflush(stdout); 
    printf("\n"); 
} 
9

Lorsque vous entrez une option avec l'appel scanf(), vous tapez 2 touches de votre clavier, par exemple, 3 et ENTER.
Le scanf()consomme le '3' mais laisse l'ENTRÉE suspendue dans le tampon d'entrée.
Lorsque, plus tard, vous faites gets() que ENTER est toujours dans le tampon d'entrée et c'est ce que gets() obtient.

Vous avez deux options:

  • clair que le tampon d'entrée après chaque scanf()
  • effacer la mémoire tampon d'entrée avant chaque gets()

Pour effacer le tampon d'entrée utiliser ce code:

int clear_input_buffer(void) { 
    int ch; 
    while (((ch = getchar()) != EOF) && (ch != '\n')) /* void */; 
    return ch; 
} 

Oh! Et arrêtez d'utiliser gets(). gets() est impossible à utiliser en toute sécurité. Utilisez fgets() à la place.

+1

+1 pour avertir de 'gets'. Tellement dangereux que le standard C l'a en fait déconseillé. (Ils pourraient supporter de déprécier un peu plus, cependant ...) –

2

Lorsque vous lisez un numéro à l'aide scanf (« % d », ....), la nouvelle ligne que vous avez tapé une fois le nombre est toujours là, en attente dans le tampon d'entrée, lorsque votre programme se plus tard à la obtient. La ligne qui sera lue sera très courte, composée uniquement de cette nouvelle ligne.

N'utilisez pas fflush (stdin), puisque cela n'est pas garanti par la norme au travail. Au lieu de cela, vous pouvez lire les caractères juste dans une boucle jusqu'à ce que vous avez sauté la nouvelle ligne:

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

Il y a aussi quelques autres problèmes avec votre code, parmi eux que vous devriez vraiment pas utiliser du tout obtient, car il doesn ne vérifie pas que la ligne que vous lisez correspond bien à la variable. Utilisez à la place.