如何在 C 中打印到 stderr?

Posted

技术标签:

【中文标题】如何在 C 中打印到 stderr?【英文标题】:How I can print to stderr in C? 【发布时间】:2016-12-24 10:21:13 【问题描述】:

在 C 中,打印到标准输出很容易,printf 来自 stdio.h

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

【问题讨论】:

它的语法有什么“奇怪”的地方?它是打印 wherehowwhat 我专注于它。该问题引起的唯一问题是您发现解决方案“奇怪”。否则就没有问题了。使用fprintf @尤金。我同意你的看法。我觉得这很奇怪,因为我没有意识到 stderr 是一个文件 :) 【参考方案1】:

你知道sprintf吗?与fprintf 基本相同。第一个参数是目标(fprintf 的情况下的文件,即stderr),第二个参数是格式字符串,其余的参数和往常一样。

我也推荐this printf (and family) reference。

【讨论】:

这与 OP 无关,措辞混乱。 sprintf 将“打印”到字符串并且不能打印到标准错误。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:
#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 都进入控制台,但两者是独立的,可以单独重定向。

【讨论】:

【参考方案5】:

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

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

【讨论】:

这不会在之前的答案中添加任何内容,也不会真正回答问题。 那个 sprintf() 语句会导致内存损坏! ...我强烈建议您阅读指针、数组和字符串的工作原理。【参考方案6】:

如果您不想修改当前代码而只是为了调试使用。

添加这个宏:

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

如果您想回滚,请将 stderr 更改为 stdout

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

【讨论】:

你也可以给它一个单独的名字,也许是eprintf或其他东西。 (:O 这实际上是 GCC (3.2) 的可变参数宏示例:gcc.gnu.org/onlinedocs/gcc-3.2/cpp/Variadic-Macros.html)

以上是关于如何在 C 中打印到 stderr?的主要内容,如果未能解决你的问题,请参考以下文章

在c中打印到stderr [重复]

你如何在 R 中打印到标准错误?

如何在实时输出的同时将命令的 stdout 和 stderr 重定向到控制台和日志文件?

如何使 xcodebuild 向 stderr 打印编译错误和警告?

有没有办法在谷歌部署管理器中打印到stdout,stderr或日志文件?

如何在Python中异步记录stdout / stderr?