Простой 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++ буферизует вывод потока, и сброс приводит к пустому выходному потоку.

Другие вопросы по тегам