どうやってint
(integer)を文字列に変換しますか? struct
のデータを文字列に変換してファイルに保存する関数を作成しようとしています。
編集: コメントで指摘されているように、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 の演算子を使用してデータを出力することができます。
それを行うにはsprintf
を、あるいは持っていればsnprintf
を使うことができます。
char str[ENOUGH];
sprintf(str, "%d", 42);
str
の文字数(および終端のchar)は、次の式で計算できます。
(int)((ceil(log10(num))+1)*sizeof(char))
簡単な答えは:
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進数に変換できます。
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;
}
これは古いですが、これは別の方法です。
#include <stdio.h>
#define atoa(x) #x
int main(int argc, char *argv[])
{
char *string = atoa(1234567890);
printf("%s\n", string);
return 0;
}
何かを文字列に変換するには、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/33
はlog10(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
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;
}
構造体をファイルに出力したい場合は、事前に値を変換する必要はありません。 printfフォーマット指定を使用して値を出力する方法を指示し、printfファミリーの演算子を使用してデータを出力することができます。
integer を string に変換するには、関数itoa()
を使います。
例えば:
char msg[30];
int num = 10;
itoa(num,msg,10);