Простой 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), он отлично работает. Что может быть неправильно?
Ответы
Ответ 1
При чтении ввода с использованием 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?
Ответ 2
Другие ответы верны - %c
не пропускает пробелы. Самый простой способ сделать это - помещать пробелы перед %c
:
scanf(" %c", &achar);
(Любое пробельное выражение в строке формата сделает scanf
уничтожить все последовательные пробелы).
Ответ 3
Он не пропускает второй scanf()
; второй scanf()
читает новую строку, оставленную первой scanf()
. Большинство кодов формата пропускают пробелы; формат %c
не пропускает пробел.
Ответ 4
Попробуйте также _flushall() после каждого вызова printf., По сути, по умолчанию MSS С++ буферизует поток вывода, а промывка заставляет поток вывода пустым.
Ответ 5
вызов getchar()
до scanf
также очистит сохраненный разрыв строки. Более легкий, но более ситуативный
char input_1;
char input_2;
getchar();
scanf("%c", &input_1);
getchar();
scanf("%c", &input_2);
будет очищать разрывы строк, более полезно в последовательных строках кода, где вы знаете только одно значение в очереди, а не строку