我知道printf
返回一个负面错误或成功打印的字符数。只有理由检查此返回值是否程序的执行取决于printf
状态。但我想不出这种返回值有用的场景。例如,我从来没有检查过printf
函数的返回值。为什么printf返回一个值?
从printf
返回状态有用的情况有哪些?
我知道printf
返回一个负面错误或成功打印的字符数。只有理由检查此返回值是否程序的执行取决于printf
状态。但我想不出这种返回值有用的场景。例如,我从来没有检查过printf
函数的返回值。为什么printf返回一个值?
从printf
返回状态有用的情况有哪些?
我也从未使用过返回值。 但在错误检查旁边,您可能会计算已输出的字符数,以进行某种统计或限制
它主要用于错误检查。您可以使用返回值确保操作成功或不成功。
如果返回非负值(表示写入的字符数),则表示操作成功。如果返回负数,则出现一些错误。
例如,
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int result = printf("This is a test!");
if (result > 0)
{
printf("%d characters were written!", result);
return EXIT_SUCCESS;
}
else return EXIT_FAILURE;
}
其中一个主要的原因,这是使用用于故障排除。 Printf可以用来写入文件(不仅是标准输出)。确保所有文字都写在文件中对于某些应用程序至关重要。一个例子可以在下面找到:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *fp;
printf("This will display on the screen.\n");
if((fp=freopen("OUT", "w" ,stdout))==NULL) {
printf("Cannot open file.\n");
exit(1);
}
if(printf("This will be written to the file OUT.") < 0){
return -1;
}
fclose(fp);
return 0;
}
你可能会问你为什么要用printf来打印文件。考虑这一点。一些软件的开发没有实现错误日志记录,而是使用了printf。知识丰富的C程序员可以将printf的输出重定向到代码顶部的文件,从而实现将错误记录到文件而不是STDOUT。在这一点上,他可以使用printf的返回值来确保这些错误被正确打印。
在某些情况下,printf
只能将您的字符串的一部分放入stdout,而这不是错误。
如果您必须确保您的字符串发送完成,则可以使用返回值来查看此信息。
其最适用于与fprintf
和插座等工作,但仍然可能是有用的。
有几种情况可能需要检查printf的返回值。其中之一就是检查错误,正如你提到的那样;如果printf出现错误,通常没有办法做到这一点,但是如果您打印的内容真的很大,并且出现错误,请尝试将它打印成小块。
您可能还对产量有多大感兴趣; printf()
返回成功写入的字符数。如果您尝试排列输出,并且您使用宽度可变的东西执行printf()
,则可以检查返回值以查明打印了多少个字符,以便知道您所在的列。当然,只有当你的所有字符都是1列宽(大多数ASCII字符都是如此)时,这才有效,但在某些情况下这可能会有用。
snprintf()
打印到固定大小的缓冲区而不是标准输出或文件。它只会打印到您提供的缓冲区的大小;但可能需要更多空间来打印完整的字符串。它返回打印完整字符串所需的空间量;这样,您可以使用返回值分配适当大小的新缓冲区,如果原始缓冲区太小,请重试。出于这个原因,您几乎总是使用返回值snprintf()
。
还有的printf
返回值的至少2个用途:
检查错误。当您的输出是交互式或纯粹的信息时,这很少重要,但对于正在处理来自stdio或文件的文本并将结果写入标准输出的程序,重要的是要知道错误(例如磁盘已满,已关闭管道或已丢弃网络连接)阻止了整个输出的写入。如果在输出完成后源文件将被删除/替换为输出,这一点尤其重要。但是,由于缓冲,检查printf
本身的结果通常没有帮助。在写入最后一个输出和刷新之后,您需要检查ferror(stdout)
以获得是否发生任何写入错误的可靠指示。另一方面,检查返回值printf
允许您检测到故障早期,因此您不会浪费时间在第一行失败时尝试写入数百万行,因此这可能是非常有用的检查;它本身并不是一个足够的检查。
如果输出的字符数不明显,您可能想知道已写入了多少个字符。这个数字的天真使用将用于排列列,但假设角色在其视觉呈现中具有固定的宽度是过时的。不过,如果您要格式化源代码,则可能有意义。另一个类似的用法(不确定这是否过时或过时)是在文件中写入固定宽度的字段。例如,如果你的字段是80个字节,并且printf
返回52,你希望再写入28个填充字节来结束这个字段。
这是一个糟糕的例子,其中printf()的返回值被检查! – AlexWien