为什么printf会返回一个值?

Rum*_*kin 13 c printf

我知道printf返回成功时打印的负面错误或字符数.只检查此返回值的唯一原因是程序的执行在某种程度上取决于printf状态.但我想不出这个返回值有用的场景.我,从来没有检查过printf函数的返回值.

返回状态printf有用的场景是什么?

R..*_*R.. 16

返回值至少有2次使用printf:

  1. 检查错误.当您的输出是交互式或纯信息时,这很少重要,但对于从stdio或文件处理文本并将结果写入stdout的程序,重要的是要知道是否有错误(例如磁盘已满,关闭管道或丢弃)网络连接)阻止了整个输出的写入.如果输出完成后输出将删除/替换源文件,这一点尤其重要.但是,由于缓冲,检查printf自身的结果通常没有帮助.ferror(stdout)在写入最后一个输出和刷新之后,您需要检查以便获得是否发生任何写入错误的可靠指示.另一方面,检查返回值printf可以让您及早发现故障因此,当第一行已经失败时,你不要浪费时间尝试写入数百万行,因此它可能是一个非常有用的检查; 它本身并不是一个充分的检查.

  2. 如果输出的字符数不明显,您可能想知道写入了多少个字符.这个数字的天真用法是用于排列列,但假设字符在其视觉呈现中具有固定宽度是相当陈旧的.但是,如果您要格式化源代码,则可能有意义.另一个类似的用法(不确定这是否更少或更多过时)是在文件中写入固定宽度字段.例如,如果您的字段是80个字节并printf返回52,那么您需要再写28个填充字节来完成该字段.


Bri*_*ell 5

在某些情况下,您可能需要检查printf的返回值.一个是检查错误,如你所说; 虽然如果printf上有错误,通常没有什么可以做的,如果你打印的东西真的很大,你可能会收到错误,决定尝试用较小的块打印它.

您可能还对输出的宽度感兴趣; printf()返回成功写入的字符数.如果您正在尝试排列输出,并且您printf()使用可变宽度的某些内容,则可以检查返回值以查找打印的字符数,以便了解您所在的列.当然,这仅适用于所有字符都是1列宽(大多数ASCII字符都适用)的情况,但在某些情况下这可能会有用.

snprintf()打印到固定大小的缓冲区而不是stdout或文件.它只会打印到你给它的缓冲区大小; 但它可能需要更多的空间来打印完整的字符串.它返回打印完整字符串所需的空间量; 这样,您可以使用返回值来分配适当大小的新缓冲区,如果原始缓冲区太小,请再试一次.因此,您几乎总是使用返回值snprintf().


Ale*_*ien 0

我也从来没有使用过返回值。但是除了错误检查之外,您还可以计算已输出的字符数,以进行某种统计或限制