Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中打印到stderr?_C_Printf_Stderr - Fatal编程技术网

如何在C中打印到stderr?

如何在C中打印到stderr?,c,printf,stderr,C,Printf,Stderr,在C语言中,使用stdio.h中的printf可以轻松地打印到标准输出 但是,如何打印到stderr?显然,我们可以使用fprintf来实现它,但它的语法似乎很奇怪。也许我们可以使用printf打印到stderr?你知道sprintf?这与fprintf基本相同。第一个参数是目的地(在fprintf即stderr的情况下是文件),第二个参数是格式字符串,其余的是通常的参数 我还推荐。一些格式化输出到stdout和stderr的示例: printf("%s", "He

在C语言中,使用
stdio.h
中的
printf
可以轻松地打印到标准输出


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

你知道
sprintf
?这与
fprintf
基本相同。第一个参数是目的地(在
fprintf
stderr
的情况下是文件),第二个参数是格式字符串,其余的是通常的参数


我还推荐。

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

语法几乎与
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);
#包括
int main(){
printf(“你好”);
fprintf(stderr,“救命!”);
printf(“世界”);
返回0;
}
$./a.exe
救命啊!你好,世界
$./a.exe 2>tmp1
你好,世界
$./a.exe 1>tmp1
救命啊$
  • stderr通常是无缓冲的,stdout通常是。这可能会导致像这样的奇怪输出,这表明代码以错误的顺序执行。事实并非如此,只是标准输出缓冲区尚未刷新。 重定向或管道流当然不会看到这种交织,因为它们通常只看到stdout only或stderr only的输出

  • 虽然stdout和stderr最初都会进入控制台,但它们都是独立的,可以单独重定向


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

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

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

    添加此宏:

    #define printf(args...) fprintf(stderr, ##args)
    //under GCC
    #define printf(args...) fprintf(stderr, __VA_ARGS__)
    //under MSVC
    
    如果要回滚,请将
    stderr
    更改为
    stdout


    这有助于调试,但不是一个好的实践。

    它的语法有什么“奇怪”之处?这是印刷在哪里,如何和什么。我专注于它。这个问题所引起的唯一问题是,你觉得解决办法“奇怪”。否则就没有问题了。使用
    fprintf
    @Eugene。我同意你的看法。我觉得这很奇怪,因为我没有意识到stderr是一个文件:)这不会在前面的答案中添加任何内容,也不会真正回答这个问题。sprintf()语句会导致内存损坏。。。我强烈建议您仔细阅读指针、数组和字符串的工作原理。您也可以给它起一个单独的名字,也许是
    eprintf
    或其他什么。(:O这实际上是GCC(3.2)的变量宏示例:)这与OP无关,措辞混乱。sprintf将“打印”到字符串,无法打印到stderr。
    #define printf(args...) fprintf(stderr, ##args)
    //under GCC
    #define printf(args...) fprintf(stderr, __VA_ARGS__)
    //under MSVC