11 ответов:
EDIT: как отметил в комментарии
itoa()не является стандартным, поэтому лучше использовать подход sprintf (), предложенный в конкурирующем ответе!
можно использовать
можно использовать
sprintfсделать это, или, может быть,snprintfЕсли у вас есть это:char str[ENOUGH]; sprintf(str, "%d", 42);где количество символов (плюс завершающий символ) в
strможно рассчитать с помощью:(int)((ceil(log10(num))+1)*sizeof(char))
короткий ответ:
snprintf( str, size, "%d", x );чем длиннее: сначала вам нужно узнать достаточный размер.
snprintfговорит вам длину, если вы называете его сNULL, 0в качестве первого параметра:snprintf( NULL, 0, "%d", x );Выделите еще один символ для null-terminator.
int x = -42; int length = snprintf( NULL, 0, "%d", x ); char* str = malloc( length + 1 ); snprintf( str, length + 1, "%d", x ); ... free(str);если работает для каждой строки формата, так что вы можете конвертировать float или double в string с помощью
"%g", вы можете конвертировать int в hex с помощью"%x"и так далее.
после просмотра различных версий itoa для gcc, наиболее гибкая версия, которую я нашел, которая способна обрабатывать преобразования в двоичные, десятичные и шестнадцатеричные, как положительные, так и отрицательные, является четвертой версией, найденной в http://www.strudel.org.uk/itoa/. пока
sprintf/snprintfимеют преимущества, они не будут обрабатывать отрицательные числа для десятичной преобразования. Поскольку ссылка выше либо отключена, либо больше не активна, я включил их 4-й версия ниже:char * itoa (int value, char *result, int base) { // check that the base if valid if (base < 2 || base > 36) { *result = ''; return result; } char* ptr = result, *ptr1 = result, tmp_char; int tmp_value; do { tmp_value = value; value /= base; *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)]; } while ( value ); // Apply negative sign if (tmp_value < 0) *ptr++ = '-'; *ptr-- = ''; while (ptr1 < ptr) { tmp_char = *ptr; *ptr--= *ptr1; *ptr1++ = tmp_char; } return result; }
Это старый, но вот другой способ.
#include <stdio.h> #define atoa(x) #x int main(int argc, char *argv[]) { char *string = atoa(1234567890); printf("%s\n", string); return 0; }
Если вы используете GCC, вы можете использовать функцию расширения GNU asprintf.
char* str; asprintf (&str, "%i", 12313); free(str);
преобразование чего-либо в строку должно либо 1) выделить результирующую строку, либо 2) передать в
char *назначение и размер. Пример кода ниже:для всех
intв том числеINT_MIN. Они обеспечивают последовательный выход в отличие отsnprintf()которая зависит от текущей локали.Метод 1: Возвращается
NULLо нехватки памяти.#define INT_DECIMAL_STRING_SIZE(int_type) ((CHAR_BIT*sizeof(int_type)-1)*10/33+3) char *int_to_string_alloc(int x) { int i = x; char buf[INT_DECIMAL_STRING_SIZE(int)]; char *p = &buf[sizeof buf - 1]; *p = ''; if (i >= 0) { i = -i; } do { p--; *p = (char) ('0' - i % 10); i /= 10; } while (i); if (x < 0) { p--; *p = '-'; } size_t len = (size_t) (&buf[sizeof buf] - p); char *s = malloc(len); if (s) { memcpy(s, p, len); } return s; }Метод 2: он возвращает
NULLесли буфер был слишком маленький.static char *int_to_string_helper(char *dest, size_t n, int x) { if (n == 0) { return NULL; } if (x <= -10) { dest = int_to_string_helper(dest, n - 1, x / 10); if (dest == NULL) return NULL; } *dest = (char) ('0' - x % 10); return dest + 1; } char *int_to_string(char *dest, size_t n, int x) { char *p = dest; if (n == 0) { return NULL; } n--; if (x < 0) { if (n == 0) return NULL; n--; *p++ = '-'; } else { x = -x; } p = int_to_string_helper(p, n, x); if (p == NULL) return NULL; *p = 0; return dest; }[Edit] as request by @Alter Mann
(CHAR_BIT*sizeof(int_type)-1)*10/33+3это как минимум максимальное числоcharтребуется для кодирования некоторого целочисленного типа со знаком в виде строки, состоящей из необязательного отрицательного знака, цифр и нулевого символа..количество битов без знака в знаковом целом не более
CHAR_BIT*sizeof(int_type)-1. A base - 10 представление an-разрядное двоичное число занимает доn*log10(2) + 1цифр.10/33чуть большеlog10(2). +1 для знакаcharи +1 для нулевого символа. Другие фракции могут быть использованы как 28/93.
Метод 3: Если кто-то хочет жить на краю и переполнение буфера не является проблемой, следует простое решение C99 или более поздней версии, которое обрабатывает все
int.#include <limits.h> #include <stdio.h> static char *itoa_simple_helper(char *dest, int i) { if (i <= -10) { dest = itoa_simple_helper(dest, i/10); } *dest++ = '0' - i%10; return dest; } char *itoa_simple(char *dest, int i) { char *s = dest; if (i < 0) { *s++ = '-'; } else { i = -i; } *itoa_simple_helper(s, i) = ''; return dest; } int main() { char s[100]; puts(itoa_simple(s, 0)); puts(itoa_simple(s, 1)); puts(itoa_simple(s, -1)); puts(itoa_simple(s, 12345)); puts(itoa_simple(s, INT_MAX-1)); puts(itoa_simple(s, INT_MAX)); puts(itoa_simple(s, INT_MIN+1)); puts(itoa_simple(s, INT_MIN)); }пример вывода
0 1 -1 12345 2147483646 2147483647 -2147483647 -2147483648
/*Function return size of string and convert signed * *integer to ascii value and store them in array of * *character with NULL at the end of the array */ int itoa(int value,char *ptr) { int count=0,temp; if(ptr==NULL) return 0; if(value==0) { *ptr='0'; return 1; } if(value<0) { value*=(-1); *ptr++='-'; count++; } for(temp=value;temp>0;temp/=10,ptr++); *ptr=''; for(temp=value;temp>0;temp/=10) { *--ptr=temp%10+'0'; count++; } return count; }
Если вы хотите вывести свою структуру в файл, нет необходимости предварительно конвертировать какое-либо значение. Вы можете просто использовать спецификацию формата printf, чтобы указать, как выводить ваши значения и использовать любой из операторов из семейства printf для вывода ваших данных.
INT to CHAR [ полный пример кода]
#include <stdio.h> int main() { char s[]=""; sprintf(s,"%d",368); printf("%s",s); }и нет необходимости объявлять размер вектора s[] .. крутой Хун?! : -)
Примечание: не запускается int value С "0"
используйте функцию itoa () для преобразования целого числа в строку
например:
char msg[30]; int num = 10; itoa(num,msg,10);
Comments