printf("/*something else*/"); /*note that:without using \n in printf*/
我知道printf()使用一个缓冲区来打印它所包含的内容,当在行缓冲区中,缓冲区函数看到“\ n”时。因此,当我们忘记在printf()中使用“\ n”时,很少会清空行缓冲区。因此,printf()不会完成它的工作。我错了吗?
答案 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
显然会失败。