Подтвердить что ты не робот

Простой 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), он отлично работает. Что может быть неправильно?

4b9b3361

Ответ 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);

будет очищать разрывы строк, более полезно в последовательных строках кода, где вы знаете только одно значение в очереди, а не строку