web-dev-qa-db-ja.com

C言語でintを文字列に変換する方法

どうやってint(integer)を文字列に変換しますか? structのデータを文字列に変換してファイルに保存する関数を作成しようとしています。

158
user1063999

編集: コメントで指摘されているように、itoa()は標準ではありません。そのため、競合する回答で提案されているsprintf()アプローチを使用してください。


itoa()関数を convert あなたの整数値を文字列に変換するために使うことができます。

これが一例です。

int num = 321;
char snum[5];

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

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

構造体をファイルに出力したい場合は、事前に値を変換する必要はありません。 printfフォーマット指定 を使用して値を出力する方法を指定し、 printf family の演算子を使用してデータを出力することができます。

67

それを行うにはsprintfを、あるいは持っていればsnprintfを使うことができます。

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

strの文字数(および終端のchar)は、次の式で計算できます。

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

簡単な答えは:

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

長いです:最初に十分なサイズを見つける必要があります。 snprintfは、最初のパラメータとしてNULL, 0を付けて呼び出した場合の長さを表します。

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

ヌルターミネータには、さらに1文字を割り当てます。

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

すべてのフォーマット文字列に対して機能する場合は、"%g"を使用してfloatまたはdoubleを文字列に変換できます。"%x"を使用してintを16進数に変換できます。

41
user2622016

Gccのためにitoaのさまざまなバージョンを調べた後で、2進数、10進数、16進数への変換を処理できる最も柔軟なバージョンは http:// wwwにある4番目のバージョンです。 strudel.org.uk/itoa/sprintf/snprintfには利点がありますが、10進変換以外の負の数を扱うことはできません。上記のリンクはオフラインであるかアクティブではなくなったため、以下の4番目のバージョンを含めました。

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;
}
26
David C. Rankin

これは古いですが、これは別の方法です。

#include <stdio.h>

#define atoa(x) #x

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

何かを文字列に変換するには、1)結果の文字列を割り当てるか、2)char *の宛先とサイズを渡す必要があります。以下のサンプルコード:

どちらもINT_MINを含むすべてのintに対して機能します。現在のロケールに依存する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 = '\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;
}

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

[編集] @Alter Mannの要求に応じて

(CHAR_BIT*sizeof(int_type)-1)*10/33+3は、符号付き整数型をオプションの負の符号、数字、およびヌル文字で構成される文字列としてエンコードするのに必要なcharの最大数以上です。

符号付き整数の符号なしビット数は、CHAR_BIT*sizeof(int_type)-1以下です。 nビットの2進数を10進数で表現すると、n*log10(2) + 1桁になります。 10/33log10(2)よりわずかに大きいです。符号charの場合は+1、NULL文字の場合は+1。他の分数は28/93のように使用することができます。


方法3:Edgeに住みたくてバッファオーバーフローが問題にならない場合は、 all intを処理する単純なC99以降の解決策が続きます。

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

出力例

0
1
-1
12345
2147483646
2147483647
-2147483647
-2147483648
7
chux

GCCを使用している場合は、GNU拡張子asprintf関数を使用できます。

char* str;
asprintf (&str, "%i", 12313);
free(str);
/*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
kannadasan

構造体をファイルに出力したい場合は、事前に値を変換する必要はありません。 printfフォーマット指定を使用して値を出力する方法を指示し、printfファミリーの演算子を使用してデータを出力することができます。

2
user2374601

integer string に変換するには、関数itoa()を使います。

例えば:

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