如何用 C 打印到 stderr?

在 C 语言中,打印到标准输出很容易,printfstdio.h

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

367426 次浏览

你知道 sprintf吗?这和 fprintf基本上是一样的。第一个参数是目的地(在 fprintf的情况下是 stderr) ,第二个参数是格式字符串,其余的参数和往常一样。

我也推荐 这个 printf(和家庭)参考

格式化输出到 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)

语法几乎与 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);
#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 都来到控制台,但它们都是独立的,可以单独重定向。

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

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

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

添加这个宏:

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

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

这对调试很有帮助,但不是一个好的实践。

由于某种原因,还没有人提到 eprintf(),它与 fprintf(stderr, ...)是同一个东西。

eprintf("ERROR: You have caused an error!!1!");

快速提示: 如果使用 stderr 进行调试,则可以使用 __LINE__

#define printfError(str, ...) eprintf("ERROR at line " #__LINE__ ": " str, __VA_ARGS__)


printfError("Division by zero"); // "ERROR at line 2: Division by zero