将'printf'总能完成它的工作吗?

时间:2010-05-27 23:16:51

标签: c printf

printf("/*something else*/"); /*note that:without using \n in printf*/

我知道printf()使用一个缓冲区来打印它所包含的内容,当在行缓冲区中,缓冲区函数看到“\ n”时。因此,当我们忘记在printf()中使用“\ n”时,很少会清空行缓冲区。因此,printf()不会完成它的工作。我错了吗?

6 个答案:

答案 0 :(得分:2)

上面给出的示例是安全的,因为printf没有可变参数。但是,可以指定格式字符串并提供与格式不匹配的变量,这可能会导致意外(和不安全)的结果。一些编译器正在采用printf用例分析采取更主动的方法,但即使这样,在使用printf时也应该非常非常小心。

答案 1 :(得分:2)

从我的手册页:

  

这些函数返回打印的字符数(不包括   用于结束输出到字符串的尾随\0或负值   如果发生输出错误,则snprintf()vsnprintf()除外   返回n时打印的字符数   是无限的(再次,不包括最后的\0)。

所以,听起来像是因为负面错误而失败。

答案 2 :(得分:1)

是的,在C中输出stdout(使用printf)通常是行缓冲的。这意味着printf()将收集输出,直到:

  • 缓冲区已满,或
  • 输出包含\n换行符

如果要强制缓冲区输出,请调用fflush(stdout)。即使您打印了没有换行符的内容,这也会有效。

答案 3 :(得分:1)

printf和朋友也会失败。

在stdC库的printf系列中调用C ++ malloc()的常见实现 malloc可以失败,那么printf。在UNIX中,write()调用可以被EINTR中断,因此UNIX中的上下文切换将触发故障(EINTR)。 Windows可以并且将会做类似的事情。

并且......虽然你没有经常在这里看到它,但你应该总是从任何返回值的系统或库函数中检查返回代码。

答案 4 :(得分:0)

就像那样,没有。它并不总是按预期工作,特别是如果您使用用户输入作为格式字符串。如果第一个参数中包含%s或%d或其他格式说明符,它们将被解析并替换为堆栈中的值,如果它期望指针并获得int,则很容易中断。

这种方式往往更加安全:

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

输出缓冲区将在退出之前或输入之前刷新,因此无论您是否发送\ n,数据都会生成。

答案 5 :(得分:0)

printf可能由于多种原因而失败。如果你在递归中很深,那么调用printf可能会导致你的筹码过多。 C和C ++标准对线程问题几乎没有什么可说的,并且在printf在另一个线程中执行时调用printf可能会失败。它可能会失败,因为stdout附加到文件而您只是填充了文件系统,在这种情况下,返回值会告诉您存在问题。如果使用非零终止字符串调用printf,则可能会发生错误。如果你使用缓冲的I / O并且你的缓冲区还没有被刷新,那么printf 显然会失败。