我如何在 C 中打印到 stderr?
How I can print to stderr in C?
在 C 中,打印到标准输出很容易,printf
来自 stdio.h
。
但是,如何打印到stderr?我们显然可以使用fprintf
来实现它,但它的语法似乎很奇怪。也许我们可以使用 printf
打印到标准错误?
你知道sprintf
吗?与 fprintf
基本相同。第一个参数是目标(fprintf
即 stderr
情况下的文件),第二个参数是格式字符串,其余参数照常。
一些格式化输出到 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!$
stderr 通常是无缓冲的,而 stdout 通常是。这可能会导致像这样看起来很奇怪的输出,这表明代码以错误的顺序执行。不是,只是标准输出缓冲区尚未刷新。
重定向或管道流当然不会看到这种交错,因为它们通常只会看到 stdout 或 stderr 的输出。
尽管最初 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
。
这对调试很有帮助,但不是一个好的做法。
在 C 中,打印到标准输出很容易,printf
来自 stdio.h
。
但是,如何打印到stderr?我们显然可以使用fprintf
来实现它,但它的语法似乎很奇怪。也许我们可以使用 printf
打印到标准错误?
你知道sprintf
吗?与 fprintf
基本相同。第一个参数是目标(fprintf
即 stderr
情况下的文件),第二个参数是格式字符串,其余参数照常。
一些格式化输出到 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!$
stderr 通常是无缓冲的,而 stdout 通常是。这可能会导致像这样看起来很奇怪的输出,这表明代码以错误的顺序执行。不是,只是标准输出缓冲区尚未刷新。 重定向或管道流当然不会看到这种交错,因为它们通常只会看到 stdout 或 stderr 的输出。
尽管最初 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
。
这对调试很有帮助,但不是一个好的做法。