Пробел (
) в строке формата заставляет scanf пропускать пробелы во входных данных. Обычно это не требуется, так как большинство преобразований scanf ТАКЖЕ пропускают пробелы, прежде чем что-либо сканировать, но не имеют значения %c
и %[
- поэтому использование пробела до %[
дает видимый эффект. Давайте посмотрим, что делают ваши 3 вызова scanf:
scanf("%c",&ch); // read the next character into 'ch'
scanf("%s",&string); // skip whitespace, then read non-whitespac characters
// into 'string', stopping when the first whitespace after
// some non-whitespace is reached (that last whitespace
// will NOT be read, being left as the next character
// of the input.)
scanf("%[^\n]%*c",&sent); // read non-newline characters into 'sent', up until a
// newline, then read and discard 1 character
// (that newline)
Таким образом, 3-й scanf начнет чтение с пробела, который завершил второе сканирование. Если вы добавите пробел в начало формата, он вместо этого будет читать и отбрасывать пробелы, пока не найдет непробельный символ, а затем начнет читать в sent
с этим непробельным символом.
ТакжеИнтерес состоит в том, что произойдет, если пробел, заканчивающий второе сканирование, окажется новой строкой. В этом случае thrid scanf полностью потерпит неудачу (так как нет символов, не являющихся символом новой строки, которые нужно прочитать перед символом новой строки), и ничего не сделает. Добавление пробела здесь к третьему scanf гарантирует, что он не сработает из-за новой строки (он будет отброшен как пробел), поэтому он всегда будет считывать что-то в sent
, если не достигнут EOF.