2016-12-06 10 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()'와 같이 작성해야하는 함수로 대체하십시오. 'GetInteger()'함수는 ['fgets'] (http()를 사용하여 ~ 3-4 줄의 코드를 작성하는 것은 매우 간단합니다. : //www.cplusplus.com/reference/cstdio/fgets/) 및 ['atoi'] (http://www.cplusplus.com/reference/cstdlib/atoi/) –

+0

[왜? ! feof (file)) "always wrong?] (http : //stackoverflow.com/q/5431941/2173917) –

답변

2

음, 프로그램을 변경하려고 할 때 최소한 다른 오류 또는 오류 검사의 부족을 지적 할 수는 없지만 ... 가능한 일을 가능한 한 간단하게 유지하려고합니다. 무엇이 필요한지 이해해야합니다.

switch (atoi(op)) { 

같은 뭔가

switch ((int)op) { 

을 (또는 자신의 get_int()fgets()strtol() 또는 sscanf() 결합 생성)

을 : 할 대체입니다