如何在C中打印到stderr?


119

在C中,使用printffrom 可以很容易地打印到标准输出stdio.h

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


5
它的语法有何“奇怪”?它在哪里如何以及什么位置打印。
尤金(Eugene Sh)。

5
我正在关注它。由该问题引起的唯一问题是您找到解决方案“奇怪”。否则毫无疑问。使用fprintf
尤金(Eugene Sh)。

@Eugene。我同意你的看法。我想,因为我不知道STDERR是一个文件:很奇怪
瓦德

Answers:


179

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

33

例子:

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)

9
#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的输出。

  2. 尽管最初stdout和stderr都进入控制台,但它们都是独立的,可以单独重定向。



5

如果您不想修改当前代码,仅用于调试用途。

添加此宏:

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

如果要回滚,请更改stderrstdout

这对调试很有帮助,但这不是一个好习惯。


0

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

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

这不会为先前的答案添加任何内容,也不会真正回答问题。
很棒的狐狸先生

该sprintf()语句导致内存损坏!...我强烈建议您阅读有关指针,数组和字符串的工作方式。
BlueChip
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.