在 C 语言中,打印到标准输出很容易,printf从 stdio.h。
printf
stdio.h
但是,如何打印到 stderr?我们显然可以使用 fprintf来实现它,但它的语法似乎很奇怪。也许我们可以用 printf打印到 stderr?
fprintf
你知道 sprintf吗?这和 fprintf基本上是一样的。第一个参数是目的地(在 fprintf的情况下是 stderr) ,第二个参数是格式字符串,其余的参数和往常一样。
sprintf
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!$
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。
stdout
这对调试很有帮助,但不是一个好的实践。
由于某种原因,还没有人提到 eprintf(),它与 fprintf(stderr, ...)是同一个东西。
eprintf()
fprintf(stderr, ...)
eprintf("ERROR: You have caused an error!!1!");
快速提示: 如果使用 stderr 进行调试,则可以使用 __LINE__宏
__LINE__
#define printfError(str, ...) eprintf("ERROR at line " #__LINE__ ": " str, __VA_ARGS__) printfError("Division by zero"); // "ERROR at line 2: Division by zero