Простой C scanf не работает?
Если я попробую что-то вроде:
int anint;
char achar;
printf("\nEnter any integer:");
scanf("%d", &anint);
printf("\nEnter any character:");
scanf("%c", &achar);
printf("\nHello\n");
printf("\nThe integer entered is %d\n", anint);
printf("\nThe char entered is %c\n", achar);
Позволяет ввести целое число, затем пропускает второе scanf
полностью, это действительно странно, например, когда я поменяю местами char
scanf первый), работает нормально. Что на земле может быть не так?
5 ответов
При чтении ввода с помощью scanf
, ввод читается после нажатия клавиши возврата, но новая строка, сгенерированная клавишей возврата, не используется scanf
, что означает, что в следующий раз вы читаете char
из стандартного ввода будет новая строка, готовая к чтению.
Одним из способов избежать является использование fgets
читать входные данные в виде строки, а затем извлечь то, что вы хотите, используя sscanf
как:
char line[MAX];
printf("\nEnter any integer:");
if( fgets(line,MAX,stdin) && sscanf(line,"%d", &anint)!=1 )
anint=0;
printf("\nEnter any character:");
if( fgets(line,MAX,stdin) && sscanf(line,"%c", &achar)!=1 )
achar=0;
Еще один способ использования новой строки будет scanf("%c%*c",&anint);
, %*c
прочтет новую строку из буфера и откажется от нее.
Вы можете прочитать это:
C FAQ: Почему все говорят, что не следует использовать scanf?
Другие ответы верны - %c
не пропускает пробелы. Самый простой способ сделать это - поместить пробел перед %c
:
scanf(" %c", &achar);
(Любой пробел в строке формата scanf
потреблять все последовательные пробелы).
Это не пропустить второй scanf()
; второй scanf()
читает перевод строки, оставленный первым scanf()
, Большинство кодов формата пропускают пробелы; %c
Формат не пропускает пробелы.
Призвание getchar()
до scanf
также очистит сохраненный разрыв строки. Более легкий, но более ситуативный
char input_1;
char input_2;
getchar();
scanf("%c", &input_1);
getchar();
scanf("%c", &input_2);
будет очищать разрывы строк, более полезно в последовательных строках кода, где вы знаете, что это только одно значение в очереди, а не строка
Попробуйте также _flushall() после каждого вызова printf., В основном, по умолчанию MS C++ буферизует вывод потока, и сброс приводит к пустому выходному потоку.