2014-11-13 8 views
0

정수를 C로 된 문자열로 변환하고 싶습니다. 다음 코드를 시도했지만 프로그램에서 끊임없이 9 자리 숫자를 출력하고 있습니다. 누군가가 오류가 무엇인지 알 수 있습니까? 어떻게 해결할 수 있습니까?C에서 정수에서 문자열로 변환

int num = 158; 
char str[5]; 
sprintf(str, "%d" ,num); 
printf("The result is: %d" , sprintf); 

감사!

+0

무엇 :'printf ("결과 : % d", num);' –

+2

'% s' ('% d '가 아니라') 형식입니다. 컴파일러가'sprintf'에 대해 경고하지 않습니까? –

+0

또한 네 개의 문자 (더하기 null 종결 자)로 충분할 수도 있지만 임의의'int'에 대한 것이 아닙니다. 버퍼 크기를 12 (-2147483648에 맞추기 위해)로 조정하고'snprintf '를 사용하여 버퍼 오버 플로우를 피할 수도 있습니다. –

답변

3

인쇄 내용을 printf("The result is: %s" , str);으로 변경하십시오.

%s은 문자열의 지정자이며 문자열 이름은 str입니다. 잘못된 % 지정자를 사용하여 인쇄하면 정의되지 않은 동작이 호출됩니다.

2
printf("The result is: %d" , sprintf); 

이 코드는 sprintf을 인쇄하려고 시도합니다. 따라서 주소는 printf으로 전달됩니다. 그건 네가하려는 의도가 아니야. 주소가있는 %d이 정의되지 않은 동작으로 연결된다는 사실은 말할 것도 없습니다.

당신이 만든 문자열을 인쇄하려면 다음을 수행하십시오 당신이 제공 한 인수가 문자열이기 때문에 당신이 %s 형식 문자열을 사용해야합니다

printf("The result is: %s", str); 

참고. 당신이 원하는 모든 값을 인쇄 할 경우

, 다음 서식을 수행 할 sprintf에 대한 호출을 제거, str을 제거하고 printf를 얻을 수 있습니다 :

이의
printf("The result is: %d", num); 

하나의 장점이다 할당 할 버퍼의 크기를 결정할 필요가 없습니다. 네 자리까지의 숫자를 허용 할 수있는 길이가 5 인 버퍼 또는 네거티브 인 경우 3 자리를 할당했습니다. 숫자가 더 많은 값의 경우 코드가 해당 버퍼를 오버런합니다.

6

은 어느 당신은 % d의

printf("The result is: %d\n", num); 

또는 %의

printf("The result is: %s\n" , str); 

printf("The result is: %d" , sprintf); 

을함으로써 당신은의 진수 표현을 인쇄와 문자열 표현으로 정수를 인쇄 sprintf 함수의 주소. 예 :

sprintf의 주소를 쉽게 찾을 수 있도록 컴파일하려면 정적으로 컴파일하십시오.

➜ ~ [4] [Thu 13] $ gcc file.c -o bin -static 

코드에서 이진 파일에서 더 쉽게 찾을 수있는 16 진수 표현도 인쇄합니다. 출력 :

The result is: 4200768 
The result is: 401940 

당신은 실제로 ELF 실행 파일에 sprintf와의 선형 주소를 확인할 수 있습니다 : 예상대로

➜ ~ [4] [Thu 13] $ nm bin | grep sprintf 
0000000000480830 W asprintf 
0000000000480830 T __asprintf 
0000000000480830 T ___asprintf 
0000000000401940 T _IO_sprintf 
0000000000480a40 T _IO_vasprintf 
00000000004019d0 T __IO_vsprintf 
00000000004019d0 T _IO_vsprintf 
0000000000401940 T sprintf 
0000000000401940 T __sprintf 
0000000000480a40 W vasprintf 
00000000004019d0 W vsprintf 

, 0x0000000000401940.

+0

'예상대로 ... '아니요, UB입니다. 나는 아무것도 기대하지 않았습니다. [컴퓨터가 터지더라도] 불평하지 않아야합니다. (http://stackoverflow.com/questions/26882023/is-it-good-ide-to-pass-uninitialized-variable-to-srand/26882097#26882097) . –

관련 문제