如何在C中使用'printf'打印到标准错误?

wfveoks0  于 2023-06-28  发布在  其他
关注(0)|答案(7)|浏览(164)

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

au9on6nz

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!$
  1. stderr通常是无缓冲的,而stdout通常是。这可能会导致像这样奇怪的输出,这表明代码以错误的顺序执行。不是的,只是stdout缓冲区还没有被刷新。重定向或管道流当然不会看到这种交织,因为它们通常只能看到stdout或stderr的输出。
    1.虽然最初stdout和stderr都到达控制台,但两者都是独立的,可以单独重定向。
mkh04yzy

mkh04yzy2#

如果您不想修改当前代码,而只是为了调试使用。
添加此宏:

#define printf(args...) fprintf(stderr, ##args)
// Under GCC

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

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

uxhixvfz

uxhixvfz3#

你可能知道sprintf。这与fprintf基本相同。第一个参数是目的地(在fprintf的情况下是文件,即stderr),第二个参数是格式字符串,其余的参数和往常一样。
我也推荐this printf (and family) reference

rsl1atfo

rsl1atfo4#

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

8hhllhi25#

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

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

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);
5lhxktic

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)

相关问题