Intereting Posts

какова цель помещения пространства в scanf, такого как scanf («% c», & ch) вместо scanf («% c», & ch)?

какова цель помещения пространства в scanf как это

 scanf(" %c",&ch) 

на месте

 scanf("%c",&ch)? 

Также что такое входной буфер в fflush(stdin) ?

Поскольку пространство до %c игнорирует все пробелы. *scanf семейство функций игнорирует все пробелы до любого % по умолчанию, за исключением %c , %[ и %n . Это упоминается в C11 по адресу:

7.21.6.2.8

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

Чтобы быть полным, вот часть, в которой говорится, что все пробелы будут проигнорированы:

7.21.6.2.5

Директива, состоящая из символа (ов) белого пробела, выполняется путем чтения ввода до первого символа небелого пробела (который остается непрочитанным) или до тех пор, пока больше символов не будет прочитано. Директива никогда не терпит неудачу.


Что касается вашего второго вопроса, fflush(stdin) вызывает неопределенное поведение и не должен использоваться (внимание мое):

7.21.5.2.2

Если stream указывает на выходной stream или stream обновлений, в котором последняя операция не была введена, функция fflush приводит к тому, что любые неписанные данные для этого streamа будут доставлены в среду хоста для записи в файл; в противном случае поведение не определено .

какова цель помещения пространства в scanf, такого как scanf («% c», & ch) вместо scanf («% c», & ch)?

Таким образом, scanf будет игнорировать все пробелы, прежде чем первый непространственный символ встретится в streamе.

Также что такое входной буфер в fflush (stdin)?

То, что вы вводите в консоль, будет существовать в streamе stdin .

Однако не очищайте этот stream, это неопределенное поведение . Если вы хотите отменить символы, введенные после scanf , вы можете прочитать и отбросить их.

Пространство в scanf в этом случае говорит scanf игнорировать любые ведущие символы пробела перед символом, который вы читаете. Тем не менее, даже если перед символом нет пробелов, код будет работать и успешно прочитать символ.

Я не уверен, что вы спрашиваете в своем последнем вопросе, но stdin – стандартный stream ввода для вашей программы.

 scanf(" %c",&ch); 

Согласно странице руководства,

Белое пространство (например, пробелы, вкладки или новые строки) в строке формата соответствует любому количеству пробелов, в том числе ни одного , на входе.

Stdin является стандартным вводом. Пользователь вводит данные для программы, это сначала сохраняется в буфере, а затем, когда программа запрашивает передачу данных с помощью операции чтения, данные становятся доступными для программы. (используя scanf т. д.).

Некоторое время назад у меня была такая же проблема, когда я попытался бы прочитать переменную с помощью scanf ("%c", &ans); он ничего не читал. Таким образом, я понял, что читается символ \n с последнего ввода.

Таким образом, выполнение scanf (" %c", &ans); решил мою проблему.

Хотя, я не мог понять ваш второй вопрос четко.

Просто, чтобы дать пространство от последнего объекта, если нет, например, строка, все будет вместе без пробелов между ними.