2012-09-28 2 views
0

이것은 내 코드입니다. 내 메뉴는 계속 반복되며 입력을 요구하지 않습니다. fgets이 예상대로 작동하지 않는 이유를 모르겠습니다.fgets가 작동하지 않습니다 (stdin full로 보임)

나는 그것을 반복 계속됩니다 내 코드 심지어 내가 루프를 제거 할 때 비록 실행하면 :

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'을 켜고 있지만 스위치 설명에 기본값 : 대소 문자가 없습니다. 나는 구체적으로 당신의 질문이 무엇인지 모르겠다. 그러나 나는 그것에 대해 조사 할 것이다. – Nanomurf

+0

입력 관리 코드를 주어진 입력을 처리하는 코드와 분리 된 함수로 분리해야합니다. 'fflush (stidin)'을 사용하면 이식 할 수 없습니다. –

+0

입력 버퍼'input'을 사용자가 입력 할 수있는 가장 긴 줄보다 큰 큰 크기로 늘려야한다고 생각합니다. 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; 
} 

시스템에서 컴파일/실행/작동합니까? 그렇다면 문제는 문자열/char를 얻는 방법과는 다르지만 코드에는 다른 것이 있습니다.

+0

그렇게하면 과거 개행을 가져야하지만 그 일은 대처하기가 불가능하다. –

+0

@JonathanLeffler - 나는 동의한다. 그리고 나는 당신이 여분의'getchar()'에주의했다. 나는이 이유 때문에 던져 넣었지만, IMO가 새로운 라인을 처리하라는 추가 호출은 모든 것을 처리하는 것보다 훨씬 쉽다. 배열 물건 OP는 – Mike

+0

에 전달 된 첫 번째 문자를 보려고하고있다. 나는 그것을 시도하지 않았다. – user1706853

관련 문제