Программирование на C, функция scanf()

#c #gcc #scanf #stdin #ansi

#c #gcc #scanf #стандартный интерфейс #ansi-c

Вопрос:

Помещает ли scanf пробелы в свой буфер или входной поток? Если я скажу

 scanf("%c %d %d", amp;character, amp;num1, amp;num2);
  

И теперь скажем

 scanf("%c", amp;char2);
  

Я знаю, что ввод останется в буфере, но учитываются ли пробелы?

 scanf("%c%d%d", amp;character, amp;num1, amp;num2);
  

Это чем-то отличается от первой части.

И еще кое-что. Могу ли я каким-либо образом отключить scanf после того, как пользователь нажмет enter. Если он нажимает enter после цифры 1, например. Ввод: i 5

Могу ли я как-то заставить scanf остановиться после этого, даже если он ожидает еще одного ввода?

Комментарии:

1. Прочитайте целые строки, затем проанализируйте их, например, с помощью sscanf .

Ответ №1:

Пробел в строке формата scanf будет занимать все пробелы (если таковые имеются); спецификатор формата %d также проигнорирует любые пробелы перед фактическим числом. Таким образом, " %d" имеет тот же эффект, что и "%d" . Спецификатор формата %c не будет игнорировать пробелы, но будет считывать их, поэтому " %c" будет отличаться от "%c" . В вашем случае, где %c находится в начале строки формата, scanf("%c %d %d", ...) имеет тот же эффект, что и scanf("%c%d%d", ...) .

Если вы хотите разрешить выход до того, как все будет введено, я бы посоветовал прочитать полную «строку» с помощью fgets , а затем соответствующим образом проанализировать входные данные, например, с помощью sscanf of strtok .

Комментарии:

1. Не могли бы вы объяснить мне немного подробнее, как будет работать этот scanf, завершающийся после ввода?