2012-09-28 85 views
0

這是我的代碼,請看看。我的菜單保持循環,不要求任何輸入。我不知道爲什麼fgets無法按預期工作。fgets在C中不起作用(stdin看起來很滿)C

當我運行我的代碼,它會不斷循環,即使當我擺脫循環:

int main() 
{ 
    char input[3]; 
    char opt1; 
    int flag=1,n; 

    /*hrtime_t start, end;*/ 
    dlist_t lst; 

    list_init (&lst); 
    list_input (&lst); 
    bubblesort (&lst); 

    list_display(&lst); 

    while(flag == 1) 
    { 
     printf("\nMain Menu\n"); 
     printf("-----------\n"); 
     printf("1. Bubble Sort\n"); 
     printf("2. Selection Sort\n"); 
     printf("3. Quick sort\n"); 
     printf("4. Merge Sort\n"); 
     printf("5. Exit\n"); 

     printf("\nEnter your option[1-5]: "); 

     fgets(input, 3, stdin); 
     opt1 = input[0]; 

     /* If condition to display the main menu if user inputs enter */ 
     if(opt1 == '\n') 
     { 
      flag =1; 
      continue; 
     } 

     n = strlen(input)-1; 

     if(input[n] == '\n') 
     { 
      input[n] = '\0'; 
     } else { 
      printf("\nInvalid input. "); 
      printf("Please note that the maximum length of the input is 1."); 
      readRestOfLine(); 
      flag =1; 
      continue; 
     } 

     switch(opt1) 
     { 
      case '1': 
       /*start = gethrtime(); 
        bubbleSort(list); 
        end = gethrtime();*/ 
       printf("\nBubble Sorted List\n"); 
       break; 
      case '2': 
       /* start = gethrtime(); 
        selectionSort(list); 
        end = gethrtime(); */ 
       printf("\nSelection Sorted List\n"); 
       break; 
      case '3': 
       /*start = gethrtime(); 
        quickSort(list, 0, list->list_len-1); 
        end = gethrtime(); */ 
       printf("\nQuick Sorted List\n"); 

       break; 
      case '4': 
       /*start = gethrtime(); 
        list->head = mergeSort(list->head); 
        mergeSortReverse(list); 
        end = gethrtime(); */ 
       printf("\nMerge Sorted List\n"); 
       break; 
      case '5': 
       SNExit(); 
       list_free (&lst); 
       printf("\n\n ********* THANK YOU **********"); 
       return EXIT_SUCCESS; 
      default : 
       { 
        printf("\nPlease enter valid option\n"); 
        break; 
       } 
     } 
    } 
    return EXIT_SUCCESS; 
    return 0; 
} 

/**************************************************************************** 
* Function readRestOfLine() is used for buffer clearing. 
****************************************************************************/ 
void readRestOfLine() 
{ 
    int c; 

    /* Read until the end of the line or end-of-file. */ 
    while ((c = fgetc(stdin)) != '\n' && c != EOF) 
     ; 
    fflush(stdin); 
    /* Clear the error and end-of-file flags. */ 
    clearerr(stdin); 
} 
+0

您正在打開'opt1',但您的switch語句中沒有默認值:case。我不確定你的問題具體是什麼,但我會考慮這一點。 – Nanomurf

+0

您應該將輸入管理代碼分成與處理輸入相關的函數。使用'fflush(stidin)'是不可移植的。 –

+0

我認爲你應該把你的輸入緩衝區'輸入'增加到一個更大的尺寸,大於你期望用戶能夠輸入的最長行。選擇一個數字,例如1024或4096.然後讀取整行,換行符和全部,然後解析它,並忽略無關字符。 –

回答

1

我不知道......我跑你的代碼,它爲我工作得很好,所以我不知道你是如何遺漏輸入的。你是否複製完整的代碼?

由於您只使用第一個字符,爲什麼要將它讀入緩衝區呢?也許簡化輸入你能避免你的錯誤,只得到了焦炭:

... 
printf("4. Merge Sort\n"); 
printf("5. Exit\n"); 
printf("\nEnter your option[1-5]: "); 
fflush(stdout); 
opt1=getchar(); 
getchar(); // Extra "getchar" call to get rid of the newline 
... 

編輯:

讓我們試着簡化你的問題來理解失敗是。嘗試運行這段代碼來代替:

int main() 
{ 
    char input = '0'; 
    input = getchar(); 
    getchar(); 
    printf("%c\n", input); 
    return 0; 
} 

請問您的系統上編譯/運行/工作?如果是這樣,問題不在於如何獲取字符串/字符,而是與代碼有關。

+0

如果你這樣做,你必須通過換行符,但是要應付這種情況是不可能的。 –

+0

@JonathanLeffler - 我同意..我確定你注意到了我爲此扔掉了額外的'getchar()',但是IMO有一次額外的電話來處理這條新線要比處理所有的線要容易得多數組的東西是做只是爲了看看在 – Mike

+0

傳遞的第一個字符,我試過它不工作 – user1706853