Como converter um int para string em C?

Como converter um int (inteiro) para uma cadeia de caracteres? Estou tentando fazer uma função que converte os dados de um struct em uma string para salvá-la em um arquivo.

11 answers

EDIT: como indicado no Comentário, itoa() não é um padrão, por isso melhor usar a abordagem de sprintf() sugerida na resposta rival!


Pode usar a função itoa() Para converter o seu valor inteiro para uma cadeia de caracteres.

Aqui está um exemplo:

int num = 321;
char snum[5];

// convert 123 to string [buf]
itoa(num, snum, 10);

// print our string
printf("%s\n", snum);

Se quiser enviar a sua estrutura para um ficheiro, não há necessidade de converter qualquer valor de antemão. Pode apenas utilizar a especificação do formato printf para indicar como apresentar o seu Value e use qualquer um dos operadores de printf family para enviar os seus dados.

 56
Author: Alexander Galkin, 2011-11-24 13:34:42

Pode usar sprintf para o fazer, ou talvez snprintf Se o tiver:

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

Em que o número de caracteres (mais caracteres de terminação) no str pode ser calculado utilizando:

(int)((ceil(log10(num))+1)*sizeof(char))
 128
Author: cnicutar, 2013-06-23 19:30:51

A resposta curta é:

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

O mais longo é: primeiro você precisa descobrir o tamanho suficiente. snprintf diz-lhe o comprimento se lhe ligar com {[4] } Como primeiros parâmetros:

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

Atribui mais um carácter para o 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);

Se funcionar para cada texto 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.

 32
Author: user2622016, 2015-09-28 09:39:07

Depois de ter visto várias versões do itoa para o gcc, o mais flexível versão descobri que é capaz de lidar com as conversões para binário, decimal e hexadecimal, positivos e negativos, é a quarta versão encontradas em http://www.strudel.org.uk/itoa/. Enquanto sprintf/snprintf tem vantagens, eles não vão tratar números negativos para qualquer coisa diferente de decimal conversão. Uma vez que o link acima é off-line ou não mais ativo, eu incluí a sua 4ª versão abaixo:

char *
itoa (int value, char *result, int base)
{
    // check that the base if valid
    if (base < 2 || base > 36) { *result = '\0'; 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-- = '\0';
    while (ptr1 < ptr) {
        tmp_char = *ptr;
        *ptr--= *ptr1;
        *ptr1++ = tmp_char;
    }
    return result;
}
 22
Author: David C. Rankin, 2014-05-24 02:16:54
Isto é antigo, mas há outra maneira.
#include <stdio.h>

#define atoa(x) #x

int main(int argc, char *argv[])
{
    char *string = atoa(1234567890);
    printf("%s\n", string);
    return 0;
}
 8
Author: catfood, 2014-05-24 02:26:38

Se estiver a usar o GCC, pode usar a função GNU extension asprintf.

char* str;
asprintf (&str, "%i", 12313);
free(str);
 6
Author: Vicente Adolfo Bolea Sánchez, 2015-09-22 19:51:33

Converter qualquer coisa para uma cadeia deve ou 1) alocar a cadeia resultante ou 2) Passar em um destino e tamanho char *. Código da amostra abaixo:

Ambos trabalham para todos int incluindo INT_MIN. Eles fornecem uma saída consistente ao contrário de snprintf() que depende do local atual.

O Método 1: Devolve 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: devolve NULL se o buffer for demasiado 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ário para codificar o tipo inteiro assinado como uma cadeia que consiste de um sinal negativo opcional, dígitos e um carácter nulo..

O número de bits sem sinal num inteiro assinado não é superior a CHAR_BIT*sizeof(int_type)-1. Uma representação base-10 de um número binário n-bit ocupa até n*log10(2) + 1 dígitos. 10/33 é ligeiramente superior a log10(2). +1 para o sinal char e +1 para o carácter nulo. Outras frações poderiam ser usadas como 28/93.


Método 3: Se se quer viver na borda e o excesso de buffer não é uma preocupação, segue-se uma solução simples C99 ou posterior que lida com Tudo 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));
}

Resultado da amostra

0
1
-1
12345
2147483646
2147483647
-2147483647
-2147483648
 6
Author: chux, 2017-03-03 17:25:45
/*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;
     }
 3
Author: kannadasan, 2016-08-27 20:56:55

Se quiser enviar a sua estrutura para um ficheiro, não há necessidade de converter qualquer valor de antemão. Você pode apenas usar a especificação do formato printf para indicar como enviar seus valores e usar qualquer um dos operadores da família printf para enviar seus dados.

 2
Author: user2374601, 2013-05-12 09:46:40

INT TO CHAR [exemplo de código completo]

#include <stdio.h>
int main()
    {
    char s[]="";
    sprintf(s,"%d",368);
    printf("%s",s);
}

E não é necessário declarar o tamanho do vector s [] .. cool hun?! :-)

Nota: não iniciar o valor int com "0"

 0
Author: PYK, 2018-08-08 19:14:18

Use a função itoa () para converter um inteiro para uma cadeia

Por exemplo:

char msg[30];
int num = 10;
itoa(num,msg,10);
 0
Author: Codemaker, 2018-10-06 08:05:37