C言語のatoiで出来ることと使い方をまとめました
18/11/11 16:55:15 19/05/05 15:10:57
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型に変換する方法と、少数や変換できない文字が含まれた場合の処理を把握しておけば問題ないでしょう。
案件量が豊富なアルマサーチ
最後に、アルマサーチのご紹介!
アルマサーチはフリーランス向けに案件をご紹介することに特化したエージェントサービスです。豊富な案件量から、安定して継続的な案件のご紹介を実現しており、口コミから登録エンジニアが急増中です。
アルマサーチが選ばれる理由
- 豊富な案件量。週3?4日の案件や在宅リモート案件も。
- 優秀なコンサルタント陣。
- 案件に参画後もしっかりサポート。
豊富な案件量
フリーランス向けに特化し、業界屈指の案件量を誇ります!週3?4日の案件や、在宅リモート案件もありますし、その他あらゆる希望をしっかりお伝えください。最適な案件のご紹介をさせていただきます。
優秀なコンサルタント陣
技術に疎く、開発の希望を伝えても響かないエージェント・・・嫌ですよね。アルマサーチにはそのような者は一切おりません!さらに独立にまつわる税金や保険関係に詳しいスタッフが徹底的にサポートさせていただきます。
案件に参画後もしっかりサポート
常駐先が決まった瞬間に、一度も連絡が取れなくなるエージェント・・・いますよね?アルマサーチでは、そのようなことは一切ありません!常に電話やメールは即対応しますし、月に1度のランチミーティングなどから現場の状況を細かくヒアリングし、就業環境改善に尽力いたします。
人気記事