C에서 stderr로 어떻게 인쇄 할 수 있습니까?


120

C에서, 표준 출력에 인쇄하는 것은으로, 쉽게 printf에서 stdio.h.

그러나 어떻게 stderr로 인쇄 할 수 있습니까? 우리는 fprintf분명히 그것을 달성하기 위해 사용할 수 있지만 구문이 이상하게 보입니다. printfstderr로 인쇄하는 데 사용할 수 있습니까?


5
구문에 대해 "이상한"것은 무엇입니까? 어디에 , 어떻게 , 무엇을 인쇄 합니다 .
유진 Sh.

5
나는 그것에 집중하고있다. 질문에서 발생하는 유일한 문제는 솔루션이 "이상하다"는 것입니다. 그렇지 않으면 질문이 없습니다. 사용 fprintf.
유진 Sh.

@Eugene. 동의합니다. 나는 stderr이 파일이라는 것을 몰랐기 때문에 이상하다고 생각했습니다. :)
wad

답변:


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

34

예 :

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");

이것은 이전 답변에 아무것도 추가하지 않으며 실제로 질문에 답변하지 않습니다.
Fantastic Mr Fox

그 sprintf () 문은 메모리 손상을 일으 킵니다! ... 포인터, 배열 및 문자열이 어떻게 작동하는지 읽어 보는 것이 좋습니다.
BlueChip
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.