【问题标题】:Why does printf return a value?为什么 printf 返回一个值?
【发布时间】:2012-11-12 04:49:09
【问题描述】:

我知道printf 返回一个负错误或成功打印的字符数。检查此返回值的唯一原因是程序的执行是否以某种方式取决于printf 状态。但我想不出这个返回值有用的场景。一方面,我从未检查过printf 函数的返回值。

printf 的返回状态有哪些用处?

【问题讨论】:

    标签: c printf


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      在几种情况下,您可能需要检查 printf 的返回值。正如您所提到的,一种是检查错误;如果 printf 出现错误,您通常无能为力,但如果您要打印非常大的内容并出现错误,您可以决定尝试以较小的块打印。

      您可能还对输出的宽度感兴趣; printf() 返回成功时写入的字符数。如果您尝试排列输出,并且您使用可变宽度执行printf(),您可以检查返回值以找出打印了多少个字符,这样您就知道您在哪一列。当然,这仅适用于所有字符都是 1 列宽的情况(大多数 ASCII 字符都是如此),但在某些情况下这可能有用。

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

      【讨论】:

        【解决方案3】:

        使用它的主要原因之一是用于故障排除。 Printf 也可用于写入文件(不仅是 STDOUT)。确保所有字符都已写入文件在某些​​应用程序中至关重要。这方面的一个例子可以在下面找到:

        #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() 的返回值在哪里检查!
        【解决方案4】:

        它主要用于错误检查。您可以使用返回值来确定操作是否成功。

        如果返回非负值(表示写入的字符数),则表示操作成功。如果返回负数,则表示有错误。

        例如,

        #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;
        }
        

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            在某些情况下,printf 只能将部分字符串放入标准输出,这不是错误。

            如果你必须确保你的字符串发送完整,你可以使用返回值来查看。

            在使用 fprintf 和套接字等时它最有用,但仍然很有用。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2014-07-24
              • 1970-01-01
              • 2022-12-03
              • 2017-03-25
              • 2014-03-20
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多