'printf' всегда будет делать свою работу? - PullRequest
4 голосов
/ 28 мая 2010
printf("/*something else*/"); /*note that:without using \n in printf*/

Я знаю, что printf () использует буфер, который печатает все, что в нем содержится, когда в буфере строк "\ n" замечено функцией буфера. Поэтому, когда мы забываем использовать «\ n» в printf (), редко, строковый буфер не очищается. Поэтому printf () не сделает свою работу. Я не прав?

Ответы [ 6 ]

2 голосов
/ 28 мая 2010

С моей страницы руководства:

Эти функции возвращают количество напечатанных символов (не включая завершающий \0, используемый для завершения вывода в строки) или отрицательное значение в случае ошибки выводаза исключением snprintf() и vsnprintf(), которые возвращают количество символов, которое было бы напечатано, если бы n было неограниченным (опять же, не считая окончательный \0).звучит так, как может произойти сбой с отрицательной ошибкой.

2 голосов
/ 28 мая 2010

Пример, который вы привели выше, безопасен, так как нет аргументов переменной для printf. Однако можно указать строку формата и указать переменные, которые не соответствуют формату, что может привести к неожиданным (и небезопасным) результатам. Некоторые компиляторы используют более упреждающий подход с printf анализом вариантов использования, но даже тогда нужно быть очень, очень осторожным, когда используется printf.

1 голос
/ 28 мая 2010

Также printf и друзья могут потерпеть неудачу.

Общие реализации вызова C malloc () в семействе printf библиотеки stdC.
malloc может потерпеть неудачу, поэтому будет printf. В UNIX вызов write () может быть прерван EINTR, поэтому переключение контекста в UNIX вызовет сбои (EINTR). Windows может и будет делать подобные вещи.

И ... Хотя вы не часто видите его здесь, вы всегда должны проверять код возврата в любой системной или библиотечной функции, которая возвращает значение.

1 голос
/ 28 мая 2010

Да, вывод на stdout в C (с использованием printf) обычно буферизуется строкой. Это означает, что printf() будет собирать данные до тех пор, пока:

  • буфер заполнен или
  • вывод содержит \n перевод строки

Если вы хотите форсировать вывод буфера, вызовите fflush(stdout). Это будет работать, даже если вы напечатали что-то без перевода строки.

0 голосов
/ 28 мая 2010

printf может произойти сбой по ряду причин. Если вы глубоко в рекурсии, колл printf может взорвать ваш стек. Стандарты C и C ++ мало что могут сказать о проблемах с многопоточностью, и вызов printf, пока printf выполняется в другом потоке, может завершиться ошибкой. Может произойти сбой, потому что stdout присоединен к файлу, и вы только что заполнили свою файловую систему, и в этом случае возвращаемое значение говорит вам, что возникла проблема. Если вы вызываете printf со строкой, которая не заканчивается на ноль, тогда могут произойти плохие вещи. И printf может , по-видимому, потерпеть неудачу, если вы используете буферизованный ввод-вывод, и ваш буфер еще не очищен.

0 голосов
/ 28 мая 2010

Вот так, нет. Это не всегда будет работать так, как вы ожидаете, особенно если вы используете пользовательский ввод в качестве строки формата. Если в первом аргументе есть% s или% d или другие спецификаторы формата, они будут проанализированы и заменены значениями из стека, которые могут легко сломаться, если он ожидает указатель и вместо него получает int.

Этот способ намного безопаснее:

printf("%s", "....");

Выходной буфер будет очищен перед выходом или перед тем, как вы получите ввод, поэтому данные будут делать это независимо от того, отправляете ли вы \ n.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...