2010-03-17 6 views
2

내 프로그램의 일부에 아무런 작업이없는 경우 NUL 문자를 인쇄해야하는 상황이 있습니다. 내가이 인쇄 할C에서 공백없이 NUL 문자를 인쇄하려면 어떻게해야합니까?

char x = '\0'; 

... 

printf("@%[email protected]\n", x); 

을 : 코드 아래 예를 들어 가지고

@@

를하지만 출력합니다

@

@

\ 0 문자가 위와 같이 공백을 인쇄하지 않도록하는 올바른 방법은 무엇입니까?

+0

null-termination을 사용하면 "@"가 인쇄 될 것입니다. 아무도 왜 이것이 사실이 아니라고 나를 깨우칠 수 있습니까? – Smashery

+3

@Smashery :'printf'는 형식 문자열을 통해 모든 문자를 인쇄합니다. '%'는 형식 지정자이므로'printf'가 하나가되면 모드를 전환하고 인수 목록에서 다음 변수를 해석 할 대상을 찾습니다. 이 경우 지정자는 "c"이므로 인자를 문자로 처리하고 인쇄 (0을 출력) 한 다음 나머지는 서식 문자열을 계속 인쇄합니다 * 인쇄를했는지 여부 다음과 같은 문자열 :'char str [] = { '@', '\ 0', '@'}; printf ("% s", str);', 단지 "@"만 출력합니다. 이것은'printf'가 문자열을 출력 할 때 0에서 정지하기 때문입니다. – GManNickG

+0

@GMan - 건배! – Smashery

답변

7
if (x == 0) 
    printf("@@\n"); 
else 
    printf("@%[email protected]\n", x); 

실제로 공간을 인쇄하지 않고 실제로 \ 0을 출력합니다. 텍스트를보고있는 내용이 이면 \ 0을 공백으로 표시합니다.

+0

Theres 코드에 더 많은 그래서 방법을 스위트 룸 날 잘 모르겠다 –

2

어떤 시스템을 사용하십니까? 이 코드는 나를 위해 @@을 인쇄합니다.

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    char x = '\0'; 
    printf("@%[email protected]\n", x); 
    return 0; 
} 

그리고 내 로그 :

$ make 
cc -Wall -o app main.c 
$ ./app 
@@ 
+0

아마도 printf는이 경우 정의되지 않았거나 잘못 시스템 중 하나에서 구현? – Smashery

+0

시도해보십시오. ./app | hexdump -C' (필요한 경우 hexdump 설치). 실제로 NUL 바이트를 출력한다는 것을 알 수 있습니다. 단말기는 문자가없는 것으로 표시합니다. –

+0

물론, 그것은 그 바이트를 출력합니다; 터미널 윈도우의 출력은 여전히'@@'입니다. 그것은 당신이 거기에 벨 문자 (또는 다른 아닌 인쇄, 나는 짐작) 붙어 경우 동일합니다. Dunno 왜 downvote 가치가있어. –

0

약간 더 컴팩트 한 @codeka's solution의 :

#include <stdio.h> 

int main(void) { 
    char x = '\0'; 
    printf(x ? "@%[email protected]\n" : "@@\n", x); 
    return 0; 
} 
+0

'printf ("@@ \ n", x); 허용 되었습니까? –

+3

Alok : 예. 표준은 다음과 같이 말합니다. "인수가 남아있는 동안 형식이 고갈되면 과도한 인수는 (항상 그렇듯이) 으로 평가되지만 그렇지 않으면 무시됩니다." – caf

+0

FYI 7.19.6.1 in WG14/N1124 –

0

당신은 1의 정밀도로 %s 지정자를 사용할 수 있습니다 : 여기 내 샘플 프로그램입니다

printf("@%[email protected]", &x); 

이것은 x의 데이터를 '\0' 종료 문자열로 취급하지만 최대 하나의 문자 만 인쇄하므로 문자 다음에 '\0' 터미네이터가 없어도 상관 없습니다. x == 0이면 빈 문자열이므로 '@'문자 사이에 아무 것도 인쇄되지 않습니다.

물론 이렇게하면 문자 자체가 아닌 문자에 대한 포인터를 전달해야합니다 (따라서 &x).

일종의 해킹이지만, 문제의 허용 범위 내로 아직 생각합니다.

관련 문제