如何在C中打印到stderr?

ckx4rj1h  于 2023-04-05  发布在  其他
关注(0)|答案(7)|浏览(222)

在C中,打印到标准输出很容易,从stdio.h打印printf
但是,如何打印到stderr呢?我们可以使用fprintf来实现,但它的语法似乎很奇怪。也许我们可以使用printf来打印到stderr?

rlcwz9us

rlcwz9us1#

语法几乎与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);
bprjcwpo

bprjcwpo2#

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

fjaof16o3#

#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缓冲区尚未被刷新。重定向或管道流当然不会看到这种交织,因为它们通常只会看到stdout或stderr的输出。
    1.虽然最初stdout和stderr都到达控制台,但两者都是独立的,可以单独重定向。
agyaoht7

agyaoht74#

如果您不想修改当前代码,只想用于调试。
添加此宏:

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

如果要回滚,请将stderr更改为stdout
这对调试很有帮助,但不是一个好的实践。

pwuypxnk

pwuypxnk5#

你知道sprintf吗?基本上和fprintf是一样的。第一个参数是目的地(在fprintf的情况下是文件,即stderr),第二个参数是格式字符串,其余的都是参数。
我也推荐this printf (and family) reference

1rhkuytd

1rhkuytd6#

由于某种原因,还没有人提到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
g2ieeal7

g2ieeal77#

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

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

相关问题