【问题标题】:How I can print to stderr in C?如何在 C 中打印到 stderr?
【发布时间】:2016-12-24 10:21:13
【问题描述】:

在 C 中,打印到标准输出很容易,printf 来自 stdio.h

但是,如何打印到stderr?我们显然可以使用fprintf 来实现它,但它的语法似乎很奇怪。也许我们可以使用printf 打印到标准错误?

【问题讨论】:

  • 它的语法有什么“奇怪”的地方?它是打印 wherehowwhat
  • 我专注于它。该问题引起的唯一问题是您发现解决方案“奇怪”。否则就没有问题了。使用fprintf
  • @尤金。我同意你的看法。我觉得这很奇怪,因为我没有意识到 stderr 是一个文件 :)

标签: c printf stderr


【解决方案1】:

你知道sprintf吗?与fprintf 基本相同。第一个参数是目标(fprintf 的情况下的文件,即stderr),第二个参数是格式字符串,其余的参数和往常一样。

我也推荐this printf (and family) reference

【讨论】:

  • 这与 OP 无关,措辞混乱。 sprintf 将“打印”到字符串并且不能打印到标准错误。
【解决方案2】:

格式化输出到 stdout 和 stderr 的一些示例:

printf("%s", "Hello world\n");              // "Hello world" on stdout (using printf)
fprintf(stdout, "%s", "Hello world\n");     // "Hello world" on stdout (using fprintf)
fprintf(stderr, "%s", "Stack overflow!\n"); // Error message on stderr (using fprintf)

【讨论】:

    【解决方案3】:

    语法与printf 几乎相同。使用printf,您可以提供字符串格式及其内容,即:

    printf("my %s has %d chars\n", "string format", 30);
    

    fprintf 是一样的,只是现在您还要指定打印到的位置:

    FILE *myFile;
    ...
    fprintf( myFile, "my %s has %d chars\n", "string format", 30);
    

    或者在你的情况下:

    fprintf( stderr, "my %s has %d chars\n", "string format", 30);
    

    【讨论】:

      【解决方案4】:
      #include<stdio.h>
      
      int main ( ) {
          printf( "hello " );
          fprintf( stderr, "HELP!" );
          printf( " world\n" );
          return 0;
      }
      
      $ ./a.exe
      HELP!hello  world
      $ ./a.exe 2> tmp1
      hello  world
      $ ./a.exe 1> tmp1
      HELP!$
      
      1. stderr 通常是无缓冲的,而 stdout 通常是。这可能会导致像这样看起来很奇怪的输出,这表明代码以错误的顺序执行。不是,只是标准输出缓冲区尚未刷新。 重定向或管道流当然不会看到这种交错,因为它们通常只会看到 stdout 或 stderr 的输出。

      2. 虽然最初 stdout 和 stderr 都进入控制台,但两者是独立的,可以单独重定向。

      【讨论】:

        【解决方案5】:

        要打印您的上下文,您可以编写如下代码:

        FILE *fp;
        char *of;
        sprintf(of,"%s%s",text1,text2);
        fp=fopen(of,'w');
        fprintf(fp,"your print line");
        

        【讨论】:

        • 这不会在之前的答案中添加任何内容,也不会真正回答问题。
        • 那个 sprintf() 语句会导致内存损坏! ...我强烈建议您阅读指针、数组和字符串的工作原理。
        【解决方案6】:

        如果您不想修改当前代码而只是为了调试使用。

        添加这个宏:

        #define printf(args...) fprintf(stderr, ##args)
        //under GCC
        #define printf(args...) fprintf(stderr, __VA_ARGS__)
        //under MSVC
        

        如果您想回滚,请将 stderr 更改为 stdout

        这对调试很有帮助,但不是一个好习惯。

        【讨论】:

        猜你喜欢
        • 2020-01-24
        • 2011-07-31
        • 1970-01-01
        • 2021-05-23
        • 1970-01-01
        • 1970-01-01
        • 2021-01-20
        • 2016-03-13
        • 1970-01-01
        相关资源
        最近更新 更多