3 ответа
Лучший ответ
— считывает до символов из указанного потока в буфер, включая завершающий символ новой строки, если есть место. Добавляет терминатор 0 в конец буфера, делая его допустимой строкой C:
В случае успеха возвращает адрес входного буфера. При сбое или конце файла возвращается .
— считывает одиночный символ из указанного входного потока и возвращает его:
— устарел после C99, полностью удален из C2011. Как и , он считывал последовательность символов из стандартного ввода в буфер и добавлял терминатор 0, но в отличие от он не предоставлял механизма ограничения ввода, что делало его популярным эксплойтом вредоносного ПО. Кроме того, он не сохранит завершающую новую строку в буфере. Его использование гарантировало появление точки отказа в вашем коде. Представьте, что вы никогда об этом не слышали.
— идентично , за исключением того, что он может быть реализован как макрос.
— считывает один символ из стандартного ввода:
— записывает строку в указанный выходной поток:
— записывает один символ в указанный выходной поток:
— идентично , за исключением того, что он может быть реализован как макрос
— записывает один символ в стандартный вывод.
2
John Bode
30 Авг 2016 в 14:31
Считывает символы из потока и сохраняет их в виде строки C в str до тех пор, пока не будут прочитаны (num-1) символы или не будет достигнут перевод строки или конец файла, в зависимости от того, что наступит раньше. Символ новой строки заставляет fgets перестать читать, но считается допустимым символом и поэтому включается в строку, скопированную в str. Нулевой символ автоматически добавляется в str после прочитанных символов, чтобы обозначить конец строки C.
Записывает в поток строку, на которую указывает str. Функция начинает копирование с указанного адреса (str), пока не достигнет завершающего нулевого символа (‘\ 0’). Этот последний нулевой символ не копируется в поток.
Получить символ из стандартного ввода. Возвращает следующий символ из стандартного ввода (stdin). Это эквивалентно getc с аргументом stdin.
Записать символ в stdout Записывает символ в текущую позицию в стандартном выводе (stdout) и перемещает внутренний индикатор позиции файла на следующую позицию. Эквивалентен putc (character, stdout).
: из стандартного ввода в память
: из памяти в стандартный ввод
1
khakishoiab
26 Окт 2016 в 19:00
— это функция, которая предлагает нажать клавишу, в которой символ не отображается эхом.
Напротив, будет повторять символ обратно.
будет читать символы из , но это небезопасно (используйте вместо этого ).
вернет следующий символ, который он считывает из , это то же самое, что и вызов с в качестве аргумента.
считывает символы из потока (например, файла или ) и сохраняет их как строку C в до тех пор, пока не будут прочитаны (num-1) символы или символы новой строки или достигнуто.
записывает символ в . Это то же самое, что вызов с в качестве аргумента.
записывает строку C, на которую указывает , в и добавляет символ новой строки. Он начинает копирование до тех пор, пока не достигнет нулевого конца (). Нуль-терминатор не печатается.
записывает строку C, на которую указывает в поток, и по сути похож на
Что касается вашего кода, старайтесь избегать использования , так как это небезопасно, и используйте , то же самое касается . Вместо этого используйте .
Я знаю, что это ссылка на C ++, но функции библиотеки такие же
2
Garf365
30 Авг 2016 в 10:25
fgets ()
As все остальные говорили, каноническая альтернатива is задание как файловый поток.
то, о чем еще никто не упоминал, это не включает новую строку, но делает. Таким образом, вам может потребоваться использовать обертку вокруг это удаляет новую строку:
или, лучше:
также, как caf указывает в комментарий paxdiablo показывает в своем ответе, с возможно, у вас остались данные на линии. Мой код оболочки оставляет эти данные для чтения в следующий раз; вы можете легко изменить его, чтобы проглотить остальную часть строки данных, если хотите:
остаточная проблема заключается в том, как сообщить о трех различных состояниях результата — EOF или error, line read and not truncated, и partial line read but data was truncated.
эта проблема не возникает с потому что он не знает, где ваш буфер заканчивается и весело топчет за концом, нанося хаос на ваш красиво ухоженный макет памяти, часто путаясь в обратном стеке (a Переполнение Стека), если буфер выделен в стеке, или вытаптывание управляющей информации, если буфер динамически выделен, или копирование данных по другим ценным глобальным (или модульным) переменным, если буфер статически выделен. Ни одна из них не является хорошей идеей — они воплощают фразу » undefined поведение.`
есть еще TR 24731-1 (технический доклад Комитета по стандартам C), который обеспечивает более безопасные альтернативы различным функциям, включая :