2012-09-28 3 views
0

Это мой код, пожалуйста, посмотрите. Мое меню продолжает циклироваться и не запрашивает ввода. Я не знаю, почему fgets не работает должным образом.fgets не работает (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', но у вас нет дефолтного: case в вашей инструкции switch. Я не уверен, что конкретно ваш вопрос, но я бы посмотрел на это. – 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 
... 

EDIT:

Давайте попробуем упростить вашу проблему, чтобы понять, где неудача. Попробуйте вместо этого использовать этот код:

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

Выполняет ли это компиляцию/запуск/работу в вашей системе? Если это так, проблема заключается не в том, как вы получаете строку/char, а что-то еще с вашим кодом.

+0

Вам нужно пройти мимо новых строк, если вы это сделаете, но с этим трудно справиться. –

+0

@JonathanLeffler - Я согласен .. и я уверен, что вы отметили дополнительный 'getchar()' я бросил по этой причине, но IMO один дополнительный вызов, чтобы избавиться от новой линии, намного проще, чем иметь дело со всеми массив stuff OP делает просто, чтобы посмотреть на первый символ, прошедший в – Mike

+0

. Я попробовал, он не работает. – user1706853

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