お役立ち情報

C言語のatoiで出来ることと使い方をまとめました

atoiのイメージ

C言語では、文字列を数値型に変換することが可能です。具体的な関数としては「atoi」「atol」「atof」があります。このページでは主にatoiについて解説しますが、理屈としては同じなので合わせてatol、atofについても解説します。

atoi、atol、atofとは

C言語では文字列を数値型に変換できることは上記の通りですが、atoi、atol、atofにはそれぞれどのような違いがあるのでしょうか。それは、「atoi→int型への変換」「atol→long型への変換」「atof→float型への変換」という違いになります。

atoの後ろに続く最後のアルファベット「i」「l」「f」がそれぞれint、long、floatの頭文字を表しています。文字列を数値型のなかでもどの型に変換したいかによって、関数を使い分けます。

atoiの使用例

次に、atoiを実際に使用している例をソースコードをベースに確認していきます。atoiの使用方法は簡単ですが、ヘッダーファイルの「stdlib.h」をインクルードする必要があるため、そこを忘れてエラーが出ないよう注意が必要です。

実際のサンプルコードは以下のようになります。

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

int main(void) {
     char str[8] = "12345";
     int num;
     //文字列型からint型への変換
     num = atoi(str);
     printf(“%d”, num);
     return 0;
}

以上のソースコードを実行すると、コンソールには以下のように出力されます。

12345

char型のstrという変数をint型に変換しました。numという変数に格納する際にatoi(str)と記述するだけなので、変換作業は簡単です。ちなみに、atolの場合も同様に以下のようになります。

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

int main(void) {
     char str[8] = "12345";
     long num;
     //文字列型からlong型への変換
     num = atol(str);
     printf (“%d”, num);
     return 0;
}

上記のソースコードを実行すると以下のようにコンソール出力されます。

12345

atolの場合もatoiとまったく同じ形で、ソースコードとしては変数の宣言がlong型になり、numに格納する際のコードがatolになるだけです。atofの場合も同様ですが、一応紹介しておきます。

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

int main(void) {
     char str[8] = "12.345";
     float flt;
     //文字列型からfloat型への変換
     flt = atof(str);
     printf(“%d”, flt);
     return 0;
}

上記のソースコードを実行すると、以下のようにコンソール出力されます。

12,345000

いろいろなatoi変換

atoi、atol、atofの基本的な変換処理の方法をソースコードで紹介しましたが、次にatoiの変則的な変換事例も含めてソースコードを紹介します。

#include <stdlib.h>
main() {
     int num;
     char ptr[1];

     num = atoi( "123" );
     printf( "num=%d\n" , num );//123

     num = atoi( "abc" );
     printf( "num=%d\n" , num );// 0

     num = atoi( "1a2b3c" );
     printf( "num=%d\n" , num );// 1

     num = atoi( "a7b8c9" );
     printf( "num=%d\n" , num );// 0

     num = atoi( "" );
     printf( "num=%d\n" , num );/ / 0

     ptr[0] = '\0';
     num = atoi( &ptr[0] );
     printf( "num=%d\n" , num );/ / 0

     num = atoi( "11.1111" );
     printf( "num=%d\n" , num );/ /11
}

上記のソースコードを実行すると、以下のようにコンソール出力されます。

num=123
num=0
num=1
num=0
num=0
num=0
num=11

まず一番上の文字列については、そのまま数値型に変換できるため、数値に変換されました。0を返している4つについては、変換不能ということで0を返しています。atoiは、数値に変換できない場合0を返す仕様になっています。

atoiに限らず、処理できない場合に0を返す関数は多いので、atoiについても例外ではありません。次に、小数部分はint型なのでカットされます。なので、11.1111は11と返されました。

また”1a2b3c”は1と返されていますが、これは最初の1までは数値型に変換できたからです。1の次にaがありますが、この時点で数値型変換できないので処理は終了します。あまりこのような記述をすることはないので知っておく必要はないかもしれませんが、a以降の数値は数値型に変換されません。

数値型に変換できる部分は変換し、変換できない文字が入った段階で処理を終了する仕様になっています。

他には、あまり気にする機会はないかもしれませんがintやlongの範囲外の数値を変換しようとするとイレギュラーな変換がされます。

#include <stdlib.h>
main() {
     int num;

//整数オーバーフロー・アンダーフロー(int型の範囲外)
num = atoi(“2147483648”);
printf( “num=%d\n” , num ); // -2147483648

num = atoi(“-2147483649”);
printf( “num=%d\n” , num ); //2147483647

/* 整数オーバーフロー・アンダーフロー(unsigned int型の範囲外) */
num = atoi(“4294967296”);
printf( “num=%d\n” , num ); //0

num = atoi(“4294967297”);
printf( “num=%d\n” , num ); //1

/* 整数オーバーフロー・アンダーフロー(long型の範囲外) */
num = atoi(“9223372036854775808”); //
printf( “num=%d\n” , num ); -1

num = atoi(“-9223372036854775809”);
printf( “num=%d\n” , num ); //0
}

上記のソースコードを実行すると、以下のようにコンソール出力されます。

num=-2147483648
num=2147483647
num=0
num=1
num=-1
num=0

このようにコンソール出力されるのですが、atoiの特殊な仕様によって上記のように出力されているわけではありません。たとえば、int型の変数に上記の値を文字列ではなく数値型で直接入力して、コンソール出力しようとすると同様の結果になります。

以上atoiの使い方について説明してきましたが、基本的な部分を知っておけば問題ないでしょう。システムによってはオーバーフローや文字列を変換しようとした場合のエラーについて考慮しなければならないかもしれませんが、そのような機会は稀です。

特にC言語を学習し始めてしばらくはそのような機会はないかと思うので、atoiでint型に変換する方法と、少数や変換できない文字が含まれた場合の処理を把握しておけば問題ないでしょう。

キャリアカウンセリングのプロとして
あなたに合った案件をご案内します。

まずはお気軽にお問い合わせください!

イメージ