Игнорирует ли функция Scanf клавишу Enter при поиске совпадения %d?

Я новичок в языке C и изучаю его по книге Кима Н. Кинга. В нем говорится, что scanf() ищет числовой шаблон, игнорируя пробелы, но я думаю, что он также пропускает клавишу Enter. Хотя, если он ищет символы, он, очевидно, также использует пробелы.

Поэтому в этом примере кода я должен использовать getchar() для очистки потока перед вторым scanf(), иначе второй будет выполнен без ожидания ввода пользователя.

printf("Enter a char: ");
scanf("%c", &ch1);
getchar();
printf("\nEnter another char: ");
scanf("%c", &ch2);

Если вместо этого я ищу цифры, у меня нет проблем.

printf("Enter a number: ");
scanf("%d", &n1);
printf("\nEnter another number: ");
scanf("%d", &n2);

Верно ли мое предположение (пропускается клавиша Enter)?


person VeVeVez    schedule 26.06.2016    source источник
comment
Что такое введите ключевое слово? Символ новой строки является одним из пробелов.   -  person MikeCAT    schedule 26.06.2016
comment
Пробелы не обязательно являются одиночными пробелами. isspace ищет пробелы, то есть новые строки, возвраты каретки, переводы строк, вертикальные/горизонтальные табуляции и одиночные пробелы (возможно, я что-то забыл).   -  person cadaniluk    schedule 26.06.2016
comment
извините, я имею в виду клавишу ввода или клавишу возврата. Я редактирую это.   -  person VeVeVez    schedule 26.06.2016
comment
Ваше предположение неверно. Не будет ключа для чтения из потока C, поэтому он никогда не будет пропущен.   -  person MikeCAT    schedule 26.06.2016


Ответы (1)


Нажатие клавиши ENTER вводит newline (\n), который является символом пробела.

Цитата из C11, глава §7.21.6.2, fscanf()

Директива, являющаяся спецификацией преобразования, определяет набор соответствующих входных последовательностей, как описано ниже для каждого спецификатора. Спецификация преобразования выполняется в следующие шаги:

  1. Входные пробельные символы (как указано функцией isspace) пропускаются, если спецификация не включает спецификатор [, c или n. [....]

Итак, да, любой начальный пробел (присутствующий во входном буфере) пропускается или игнорируется для %d.

person Sourav Ghosh    schedule 26.06.2016