2016-09-26 2 views
-1

Я хотел бы преобразовать каждую цифру целого числа в символ и при необходимости добавить ведущие 0.Преобразуйте каждую цифру целого числа в символ с помощью C

char arr[4]; 
int i = 5; 

Я хочу сохранить это значение и есть массив выглядеть, 0005. Аналогично, если i = 43 Я хочу, чтобы массив равнялся 0043.

Кто-нибудь знает, как я могу это сделать?

+0

Вы действительно хотите это сделать или просто хотите отобразить данные? Семейные функции 'printf' могут добавлять к вам ведущие 0. – yano

+0

Как вы хотите контролировать размер массива, который получает результат? Действительно ли код «знает» массив достаточно велик? Или код должен обрабатывать значения, такие как -9999 и 1000000000? – chux

+5

Вы хотите массив 4 'char' или строку? – chux

ответ

10

Вы можете просто использовать sprintf:

char arr[5]; 
int i = 5; 
sprintf(arr, "%04d", i); 

Обратите внимание, что этот код является потенциально небезопасным, так как вы можете хранить только до 4-х символов в arr, поэтому значение> 9999 приведет к непредсказуемому поведению. В идеале arr должен быть достаточно большим, чтобы удерживать представление максимально возможного (положительного или отрицательного) значения int, например. char arr[16];


Примечания: если вы действительно не можете иметь завершающий '\0' характера какие-то причины (например, произвольное ограничение проблемы домашнего задания), то вы можете написать простой цикл:

for (int k = 3; k >= 0; --k) 
{ 
    arr[k] = i % 10 + '0'; 
    i /= 10; 
} 
+0

Я хочу сохранить значения, но не печатать их. – Nic

+2

'sprintf' на самом деле не печатается. Префикс 's' означает' string': он отображает текст в символы по адресу памяти – slezica

+2

'sprintf' будет хранить значения в 'arr', а не печатать их. – GrahamS

0

Если вы не хотите использовать snprintf, вы можете сделать что-то вроде следующего:

char arr[4]; 
unsigned int i = 49; 

for (char *out = arr + sizeof(arr) - 1; out >= arr; i /= 10) 
    *out-- = '0' + i % 10; 

Это было бы заполнить весь массив нулями перед числом, я думаю, что это то, что вы хотели.

Не работает для отрицательных чисел. Вам это нужно?

+1

Проблема с 'out> = arr' заключается в том, что следующий' out - 'является UB, когда' out == arr'. Предложите 'для (char * out = arr + sizeof (arr); out> arr; i/= 10) * (- out) = '0' + i% 10;' и застраховать 'i> = 0'. – chux

+0

Это действительно неясный способ выразить этот цикл! – GrahamS

+0

@chux Во-первых, причина его реализации заключается в том, что он генерирует оптимальный код в x86 в других архитектурах, где можно комбинировать хранилище и манипуляцию указателем. Во-вторых, нет UB. –

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