2014-08-28 2 views
0

Так что я тестировал несколько вещей, и я заметил, что со следующим кодом, если пользовательский ввод Y/y, он не выйдет из цикла (я вызываю getchar() еще раз, чтобы избавиться от \ п в очереди, так что будет готов к следующему входу от пользователя):C getchar() странное поведение

#include <stdio.h> 
#include <stdbool.h> 

int main(int argc, char* argv[]) { 
    for(int i = 0; i < argc; i++) 
     printf("argv[%d] = %s\n", i, argv[i]); 
    char name[20]; 
    printf("What's your name ? "); 
    gets(name); 
    char lastname[20]; 
    printf("%s what's your last name ? ", name); 
    fgets(lastname, 20, stdin); 
    int age; 
    printf("%s %s what's your age? ", name, lastname); 
    scanf("%d", &age); 
    bool exit = false; 
    char c; 
    while (!exit) { 
     printf("Do you wish to exit the program ? (Y/N) "); 
     c = getchar(); 
     getchar(); 
     if (c == 'Y' || c == 'y') 
      exit = true; 
    } 
    printf("Have a nice day %s %s.\n", name, lastname); 
    return 0; 
} 

Может кто-нибудь просветить меня, что это проблема?

+0

Скомпилируйте все предупреждения и информацию об отладке (например, 'gcc -Wall -g'). Затем используйте отладчик (например, 'gdb') –

+0

Вы забыли нажать enter после Y? – Sayutee

+0

Вы должны изучить * каждый * символ, который вы читаете, и обрабатывать каждый, а не предполагать, что вы получите новые строки при определенных вызовах. – hyde

ответ

0

Во входном потоке во входном потоке уже присутствует символ новой строки. Это приведет к тому, что ваш первый getchar вернется \n. Второй getchar читает Y. Чтобы исправить это, вам необходимо позвонить getchar, прежде чем вводить цикл.

+0

Когда я узнал о функции getchar, мне сказали, что он содержит вход внутри очереди, значит ли это, что эта очередь не является исключительной для функции getchar, но для всех функций ввода? Кроме того, откуда появился символ \ n? Я бы предположил, что это произошло из последней функции ввода, которая была вызвана, которая была scanf, но насколько я знаю, она отбрасывает символ \ n, который он возвращает, но, может быть, он просто не возвращает его и остается в очереди? Я был бы благодарен, если бы вы могли объяснить мне этот вопрос. – AALC

+0

Все входные данные с функциями 'scanf' и' getchar' связаны с потоком 'stdin', поэтому да, все они имеют одну и ту же входную очередь. Ваша проблема заключается в том, что 'scanf' оставляет строку в очереди, потому что вы указали'% d' в качестве входного формата. Если бы вы указали '% d \ n', тогда' scanf' проглотил бы новую строку для вас. Таким образом, вы можете решить проблему таким образом или просто добавить вызов getchar перед циклом. –

+0

Хорошо, я думаю, теперь я понимаю лучше. Последний вопрос, когда вы говорите, что если бы я указал% d \ n вместо% d, то символ \ n не выскочил из очереди. Почему это ? – AALC

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