2012-12-12 2 views
2

나는 문자열을 출력해야하는 간단한 프로그램을 가지고있다. 그러나 나는 예상되는 결과를 얻지 못하고있다. 누구든지 프로그램에 무엇이 잘못되었는지 말해 줄 수 있습니까?이상하게 동작하는 print

main() 
{ 
    char arr[] = "Test_string"; 
    printf("%20s"+1,arr); 
    return 0; 
} 

output: 20s 

예상 출력은 다음과 같습니다 : 우리는 형식 지정자로 "%20s"을주는으로

"Test_string"Test_string 20 곳에서 인쇄하기

여기 내 코드입니다.

+9

왜 당신이 당신의 printf에서 일을해야합니까 형식 문자열 옆에 +1을 삭제할까요? – RonaldBarzell

+0

'예상 출력'은 무엇입니까? – user93353

답변

6

printf 전화를주의 깊게 보면 매우 간단합니다.

여기에 printf의 프로토 타입이 있습니다. int printf(const char *format, ...);입니다.

printf은 문자열을 첫 번째 인수로 지정하는 포인터를 필요로합니다. 프로그램에서이 문자열에 대한 포인터를 전달하고 있습니다 : "20s"printf은 전달중인 내용을 즉시 인쇄합니다.

포인터가 "20s"이 아닌 "%20s"이 아닌 이유를 설명합니다.

C에서 인용 된 문자열은 문자 포인터로 해석됩니다. 함수에 전달 될 때 포인터로 감쇠하는 문자 배열.

const char * ptr = "%20s"; 
printf(ptr+1,arr); 

당신이 "%20s"+1를 전달하기 때문에이의 printf에 전달되는 실제 포인터 문자열 "20s" 가리키는 :

const char * ptr = "%20s"; 
printf(ptr,arr); 

유사 printf("%20s"+1,arr);은 동일합니다 :

printf("%20s",arr);은 동일합니다.

+1

"C에서 인용 된 문자열은 문자 포인터로 해석됩니다." - 전혀 아닙니다. 오히려 함수에 전달 될 때 포인터로 붕괴되는 문자 배열입니다. 또한, 배열 초기화에 사용되지 않는 한 문자열 리터럴은'const'이므로'char * ptr = "% 20s"'하지만 char const * ptr = "% 20s"'를 써서는 안됩니다. –

+0

@ H2CO3 전적으로 동의합니다. 답변을 업데이트했습니다. – CCoder

+0

고맙습니다. –