パソコン活用研究シリコンバレー(C、C++、の活用研究)

データ変換関数
(準備中)

今回は、数値->文字列 や 文字列->数値 に変換する関数について整理します。

なお、Cのint型とlong型とか、int型とfloat型とか異なる型が混在した計算の場合、演算のプロセスでは
自動的にデータ型の変換(暗黙の型変換)が行われています。
この暗黙の型変換はバグを引き起こす基になるケースもあり、明示的なキャストをするのが安全です。
この問題についてはキャスト演算とオートキャストをご参照下さい。

C言語のデータ型や演算子の基本的事項については以下の関連するページをご参照下さい。
Cのデータ型の基本
Cの演算子

また、BaiscやVBAにおけるオートキャストについては、兄弟サイトの整数型へのオートキャスト
VB.netにおけるオートキャストについては、兄弟サイトのVB.netの整数型へのオートキャスト
をご参照ください。

Visual Basicでは、整数型+数値の文字列型 という演算が出来てしまって、暗黙の型変換が行われて
います。このケースもある意味やっかいな問題を引き起こす可能性があります。これについては
VBの基本のデータ型とバリアント型をご参照下さい。


データ変換関数
関数    仕様 機能・使い方
atoi #include <stdlib.h>
char *str;
int atoi(str);
文字列strをint型整数に変換する。
先頭の空白は無視される。
atol #include <stdlib.h>
char *str;
int atoi(str);
文字列strをlong型整数にする。
atof #include <stdlib.h>
char *str;
int atof(str);
文字列strをdouble型実数にする。
atof("1.25e5");のように文字列中にeやEの指数表現を書くことができる。
itoa #include <stdlib.h>
char *str;
int i, radix;
char *itoa(i, str, radix);
int型のデータiを文字列に変換してstrに格納する。radixには変換文字列の基数を指定する。2〜36の値を指定するコンパイラが多い。
返り値はstrへのポインタ。
Cの標準関数ではないが、多くののコンパイラで実装されている。
ltoa #include <stdlib.h>
char *str;
long l;
int radix;
char *ltoa(i, str, radix);
long型のデータiを文字列に変換してstrに格納する。radixには変換文字列の基数を指定する。
2〜36の値を指定するコンパイラが多い。
返り値はstrへのポインタ。
Cの標準関数ではないが、多くののコンパイラで実装されている。
strtod #include <stdlib.h>
char *str, **endptr;
double strtod(str, endptr);
文字列strをdouble型数値に変換する。返り値は変換された数値。
文字列には符合や指数表示(eやE)を含めることができる。
実数への変換が認められない文字が出現した時点で終了し、そこへのポインタをendptrに格納する。文字列が最後まで変換完了した場合はNULLがセットされる。
strtol #include <stdlib.h>
char *str, **endptr;
int radix;
double strtod(str, endptr, radix);
文字列strをlong型数値に変換する。返り値は変換された数値。
文字列には符合や16進表示(0xや0X)を含めることができる。
radixには変換文字列の基数を指定する。
2〜36の値を指定するコンパイラが多い。
endptrについてはstrtodと同じ。
ecvt #include <stdlib.h>
double v;
int digit;
int *dec, *sign;
char *ecvt(v, digit, dec, sign);
double型実数のvを文字列に変換し、それへのポインタを返します。
digitには全体のケタ数を指定します。
digitには文字列先頭からの小数点位置、signには符号を示す値(正なら0、負なら0以外)がセットされる。
gcvt #include <stdlib.h>
double v;
int dec;
char *buf;
char *gcvt(v, dec, buf);
double型の実数vを文字列に変換し、それへのポインタを返します。
bufには変換された文字列へのポインタがセットされます。

データ変換関数の使用例。
最初はatoi(str1)でstr1を整数に変換して足し算しています。
その次は、itoaでint型のiを文字列str2に変換して、strcatで文字列の連結をした後に表示しています。


<conversion.c>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {
 char str1[20]="123", str2[];
 int i,j;       
 i=654;
        j=atoi(str1)+i;
        printf("%d\n",j);
        itoa(i,str2,10);
        strcat(str1,str2);
        printf("%s",str1);
 return 0; }


実行例(Borland C++55でコンパイル)



atoiを使ったプログラムの例は「2つの数の和の問題」の中にもあります。

次は、strtod,gcvtを使った例です。
最初はstr1(="1.23e3x5")をstrtodでdouble型実数に変換しています。
途中にxという変換できない文字が混じっているので、xの前までが変換されます。
endptrには変換されなかった文字が出現した文字列へのポインタが格納されるので、
printf("%f %c\n",b,**endptr); ではその変化れなかった時点の文字を表示させています。

次にdouble型の変数a(=100.55)の値をecvtで文字列に変換し、小数点の位置(decに格納されている)
も表示させています。

3つめはそのaをgcvtで文字列に変換して表示しています。
最後のgcvtではケタ数を4に指定していますので、文字列は"100.5"に変換されています。

<conversion2.c>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {
 char *str1="1.23e3x5", *str2, str3[20], *endptr;
 double a, b;   
 int dec, sign;
 a=100.55;
        b=strtod(str1, &endptr);
        printf("%f  %c\n",b,*endptr);
        str2=ecvt(a,8, &dec, &sign);
        printf("%s  %d\n",str2,dec);
        gcvt(a,8,str3);
        printf("%s:\n",str3);
        gcvt(a,4,str3);
        printf("%s:",str3);
 return 0; }

このプログラムではstrtodで変換できない文字があった場合、その文字を表示させていますが、
変換できない文字があったかどうかは if (**endptr != NULL ) で判定できます。
あるいは if (strlen(*endptr)) でendptrに格納された文字列の長さで判断することもできます。








この他sprintfやsscanfを使った変換手法もあります。
sprintfとsscanfをご参照下さい。

  

TopPage