number - typecast int to string c




Como converter um int para string em C? (7)

Como você converte um int (inteiro) em uma string? Eu estou tentando fazer uma função que converte os dados de uma struct em uma seqüência de caracteres para salvá-lo em um arquivo.


A conversão de qualquer coisa em uma string deve 1) alocar a string resultante ou 2) passar em um destino e tamanho char * . Exemplo de código abaixo:

Ambos funcionam para todos os int incluindo INT_MIN . Eles fornecem uma saída consistente, ao contrário do snprintf() que depende da localidade atual.

Método 1: Retorna NULL em falta de memória.

#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 = '\0';
  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;
}

Método 2: Retorna NULL se o buffer for muito pequeno.

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;
}

[Editar] como pedido por @Alter Mann

(CHAR_BIT*sizeof(int_type)-1)*10/33+3 é pelo menos o número máximo de char necessários para codificar o tipo inteiro assinado como uma string que consiste em um sinal negativo opcional, dígitos e um caractere nulo.

O número de bits sem sinal em um inteiro assinado não é mais que CHAR_BIT*sizeof(int_type)-1 . Uma representação de base-10 de um número binário de n bits leva até n*log10(2) + 1 dígitos. 10/33 é um pouco mais que log10(2) . +1 para o char sinal e +1 para o caractere nulo. Outras frações poderiam ser usadas como 28/93.

Método 3: Se alguém quer viver na borda e estouro de buffer não é uma preocupação, uma solução simples C99 ou posterior segue que lida com todos 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) = '\0';
  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));
}

Amostra de saída

0
1
-1
12345
2147483646
2147483647
-2147483647
-2147483648

A resposta curta é:

snprintf( str, size, "%d", x );

Quanto mais tempo: primeiro você precisa descobrir o tamanho suficiente. snprintf informa a duração se você chamar NULL, 0 como primeiro parâmetro:

snprintf( NULL, 0, "%d", x );

Aloque um caractere a mais para o terminador nulo.

int x = -42;
int length = snprintf( NULL, 0, "%d", x );
char* str = malloc( length + 1 );
snprintf( str, length + 1, "%d", x );
...
free(str);

Se funciona para cada string de formato, então você pode converter float ou double para string usando "%g" , você pode converter int para hex usando "%x" , e assim por diante.


Isso é velho, mas aqui está outro jeito.

#include <stdio.h>

#define atoa(x) #x

int main(int argc, char *argv[])
{
    char *string = atoa(1234567890);
    printf("%s\n", string);
    return 0;
}

Se você estiver usando o GCC, você pode usar a função asprintf da extensão GNU.

char* str;
asprintf (&str, "%i", 12313);
free(str);

Você pode usar o sprintf para fazê-lo, ou talvez o snprintf se você o tiver:

char str[ENOUGH];
sprintf(str, "%d", 42);

Onde o número de caracteres (mais caracteres finais) no str pode ser calculado usando:

(int)((ceil(log10(num))+1)*sizeof(char))

use a função itoa () para converter um inteiro em uma string

Por exemplo:

char msg[30];
int num = 10;
itoa(num,msg,10);

/*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='\0';
        for(temp=value;temp>0;temp/=10)
        {
            *--ptr=temp%10+'0';
            count++;
        }
        return count;
     }




integer