在C中,打印到标准输出(stdout)很容易,printf来自stdio.h。但是,如何打印到标准错误(stderr)?显然我们可以使用fprintf来实现它,但它的语法似乎很奇怪。也许我们可以使用printf打印到标准错误?
printf
stdio.h
fprintf
au9on6nz1#
#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!$
mkh04yzy2#
如果您不想修改当前代码,而只是为了调试使用。添加此宏:
#define printf(args...) fprintf(stderr, ##args) // Under GCC #define printf(args...) fprintf(stderr, __VA_ARGS__) // Under MSVC
如果要回滚,请将stderr更改为stdout。这对调试很有帮助,但不是一个好的实践。
stderr
stdout
uxhixvfz3#
你可能知道sprintf。这与fprintf基本相同。第一个参数是目的地(在fprintf的情况下是文件,即stderr),第二个参数是格式字符串,其余的参数和往常一样。我也推荐this printf (and family) reference。
sprintf
rsl1atfo4#
由于某种原因,还没有人提到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
8hhllhi25#
要打印上下文,可以编写如下代码:
FILE *fp; char *of; sprintf(of, "%s%s", text1, text2); fp = fopen(of, 'w'); fprintf(fp, "your print line");
6tr1vspr6#
语法与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);
5lhxktic7#
格式化输出到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)
7条答案
按热度按时间au9on6nz1#
1.虽然最初stdout和stderr都到达控制台,但两者都是独立的,可以单独重定向。
mkh04yzy2#
如果您不想修改当前代码,而只是为了调试使用。
添加此宏:
如果要回滚,请将
stderr
更改为stdout
。这对调试很有帮助,但不是一个好的实践。
uxhixvfz3#
你可能知道
sprintf
。这与fprintf
基本相同。第一个参数是目的地(在fprintf
的情况下是文件,即stderr
),第二个参数是格式字符串,其余的参数和往常一样。我也推荐this
printf
(and family) reference。rsl1atfo4#
由于某种原因,还没有人提到
eprintf()
,这和fprintf(stderr, ...)
是一回事。快速提示:如果使用stderr进行调试,可以使用
__LINE__
宏8hhllhi25#
要打印上下文,可以编写如下代码:
6tr1vspr6#
语法与
printf
几乎相同。使用printf
,您可以给予字符串格式及其内容,即:fprintf
也是一样的,除了现在你还指定了打印的位置:或者在你的情况下:
5lhxktic7#
格式化输出到stdout和stderr的一些示例: