정수를 C로 된 문자열로 변환하고 싶습니다. 다음 코드를 시도했지만 프로그램에서 끊임없이 9 자리 숫자를 출력하고 있습니다. 누군가가 오류가 무엇인지 알 수 있습니까? 어떻게 해결할 수 있습니까?C에서 정수에서 문자열로 변환
int num = 158;
char str[5];
sprintf(str, "%d" ,num);
printf("The result is: %d" , sprintf);
감사!
정수를 C로 된 문자열로 변환하고 싶습니다. 다음 코드를 시도했지만 프로그램에서 끊임없이 9 자리 숫자를 출력하고 있습니다. 누군가가 오류가 무엇인지 알 수 있습니까? 어떻게 해결할 수 있습니까?C에서 정수에서 문자열로 변환
int num = 158;
char str[5];
sprintf(str, "%d" ,num);
printf("The result is: %d" , sprintf);
감사!
인쇄 내용을 printf("The result is: %s" , str);
으로 변경하십시오.
%s
은 문자열의 지정자이며 문자열 이름은 str
입니다. 잘못된 % 지정자를 사용하여 인쇄하면 정의되지 않은 동작이 호출됩니다.
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 자리를 할당했습니다. 숫자가 더 많은 값의 경우 코드가 해당 버퍼를 오버런합니다.
은 어느 당신은 % 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.
'예상대로 ... '아니요, UB입니다. 나는 아무것도 기대하지 않았습니다. [컴퓨터가 터지더라도] 불평하지 않아야합니다. (http://stackoverflow.com/questions/26882023/is-it-good-ide-to-pass-uninitialized-variable-to-srand/26882097#26882097) . –
무엇 :'printf ("결과 : % d", num);' –
'% s' ('% d '가 아니라') 형식입니다. 컴파일러가'sprintf'에 대해 경고하지 않습니까? –
또한 네 개의 문자 (더하기 null 종결 자)로 충분할 수도 있지만 임의의'int'에 대한 것이 아닙니다. 버퍼 크기를 12 (-2147483648에 맞추기 위해)로 조정하고'snprintf '를 사용하여 버퍼 오버 플로우를 피할 수도 있습니다. –