2016-12-06 2 views
1
void menu() { 
    int op; 
    printf("\n Choose a option from below : \n\n"); 
    printf(" 1: Add Contact\n" 
      " 2: View A Contact\n" 
      " 3: View All Contacts\n" 
      " 4: View All Contacts With a Common First Character\n" 
      " 5: Delete All Contact\n" 
      " 6: Delete A Contact\n" 
      " 7: Replace A Contact Name\n" 
      " 8: Replace A Contact Number\n" 
      " 9: Refresh\n" 
      " 10: Exit\n\n"); 

    printf(" Which one ? "); 
    fgets(op, 5, stdin); 

    switch ((int)op) { 
    case 1: addrecords(); break; 
    case 2: viewone(); break; 
    case 3: viewall(); break; 
    case 4: viewonechar(); break; 
    case 5: deleteall(); break; 
    case 6: deleteone(); break; 
    case 7: replaceone(); break; 
    case 8: replaceonenumber(); break; 
    case 9: refresh(); break; 
    case 10: exit(0); break; 

    default: 
     printf ("\n Wrong Option.\n\n"); 
     menu(); 
     break; 
    } 
} 

void addrecords() { 
    char name[50]; 
    char number[20]; 

    printf("\n\n Enter Contact Number (+880) : "); //Skips this 
    fgets(number, 20, stdin); 

    check(number); 

    printf(" Enter Contact Name : "); //Comes in here 
    fgets(name, 50, stdin); 

    fp = fopen("Phonebook.txt","a"); 

    fprintf(fp, "%s %s\n", name, number); 

    fclose(fp); 

    printf("\n Contact Successfully Saved!\n Returning To Main Menu...\n\n"); 

    menu(); 
} 

void check(char n[20]) { 
    char name[25]; 
    char ncheck[20]; 

    fp = fopen("Phonebook.txt", "r"); 
    fscanf(fp, "%s %s", name, ncheck); 

    while (!feof(fp)) { 
     if ((strcmp(ncheck, n)) == 0) { 
      printf ("\n Contact Already Exists.\n\n"); 
      fclose(fp); 
      menu(); 
     } else { 
      fscanf (fp, "%s %s", name, ncheck); 
     } 
    } 
} 

Хорошо, я отредактировал свою программу. После ввода 1 программа говорит неправильный вариант. Но я вхожу в пишущий. Хотя я делаю все правильно, почему программа показывает неправильный вариант? Это что-то с fgets? В чем проблема сейчас?scanf и fgets в той же программе

+0

Нет ли способа сделать scanf не оставить никаких строк перевода? –

+0

Мой совет: не используйте 'scanf', а замените его на функцию, которую вы должны написать, например,' int GetInteger() '. Замените 'scanf ("% d ", &op);' by 'op = GetInteger();'. Функция 'GetInteger()' довольно тривиально писать, ~ 3-4 строки кода, используя ['fgets'] (http : //www.cplusplus.com/reference/cstdio/fgets/) и ['atoi'] (http://www.cplusplus.com/reference/cstdlib/atoi/). –

+0

См. [Почему« пока »(! feof (file)) «всегда неправильно?» (http://stackoverflow.com/q/5431941/2173917) –

ответ

2

Ну, пытаясь изменить вашу программу, я могу и не указывать другие ошибки или ошибки проверки ошибок ... и стараюсь как можно проще понять, что происходит, что вам нужно сделать замену:

switch ((int)op) { 

что-то вроде

switch (atoi(op)) { 

(или создать свой собственный get_int() объединения fgets() и strtol()sscanf() или)

Смежные вопросы