2014-11-13 3 views
0

Я хочу преобразовать целое число в строку в C. Я пробовал следующий код, но программа постоянно выводит 9-значное число. Кто-нибудь знает, что такое ошибка, и как я могу ее исправить?Преобразование из целого числа в строку в C

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

Спасибо!

+0

about about: 'printf (" Результат:% d ", num);' –

+2

Ну, вы хотите напечатать 'str' (не' sprintf') с '% s' (не'% d'). Разве ваш компилятор не предупреждает вас о 'sprintf'? –

+0

Кроме того, в вашем случае может быть достаточно 4 символов (плюс нулевой ограничитель), но это не для произвольных 'int'. Возможно, вы хотите настроить размер буфера на 12 (для обслуживания -2147483648), а также использовать 'snprintf', чтобы избежать переполнения буфера. –

ответ

3

Измените ваш printf на printf("The result is: %s" , str);.

%s - спецификатор для строк, а имя вашей строки - str. Печать с неправильными спецификаторами% вызывает неопределенное поведение.

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

Этот код пытается напечатать sprintf, который является функцией. Поэтому его адрес переводится в printf. Это не то, что вы намеревались сделать. Не говоря уже о том, что %d с адресом приводит к неопределенному поведению.

Чтобы напечатать строку, которую вы сделали, вы сделали это:

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

Обратите внимание, что вы должны использовать формат строки %s, потому что аргумент вы поставляете строка.

Если все, что вы хотите сделать, это напечатать значение, то вы можете удалить str, удалить вызов sprintf и получить printf выполнить форматирование:

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

Одним из преимуществ этого является то, что он избегает вам решать, как большой буфер выделять. Вы выделили буфер длиной 5, который может принимать номера до 4 цифр или 3 цифры, если они отрицательные. Для значений с большим количеством цифр ваш код будет переполнять этот буфер.

6

Либо вы печатаете число с% г

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

или строковое представление с% s

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

Поступая

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

Вы печатаете десятичное представление адрес функции sprintf. Пример:

#include <stdio.h> 
int main() { 
int num = 158; 
char str[5]; 
sprintf(str, "%d" ,num); 
printf("The result is: %d\n", sprintf); 
printf("The result is: %8x\n", sprintf); 

} 

Компиляция статически, чтобы упростить поиск адреса sprintf.

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

В коде я также печатаю шестнадцатеричное представление, которое легче найти в двоичном файле. Выход:

The result is: 4200768 
The result is: 401940 

Вы действительно можете проверить линейный адрес Sprintf в ELF исполняемый файл:

➜ ~ [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-idea-to-pass-uninitialized-variable-to-srand/26882097#26882097) , –

Смежные вопросы