Linux講座にようこそ。このページは「C言語プログラミング入門 - 第14章.ライブラリ関数 - 一般ユーティリティライブラリ」です。
atof関数は文字列をdouble型の数値に、atoi関数は文字列をint型の数値に、atol関数は文字列をlong int型の数値に変換します。指定した文字列が数字でない場合は返り値として0が返りますが、数字の0の場合も返り値が0になりますので区別が付きませんので、これらの関数を使う場合は注意してください。
変換する文字列の先頭は空白(スペースやタブ、等)でも構いませんし、+や-は正・負の符号とみなします。また、atof関数は途中の.は小数点とみなします。これらの記号や数字以外が現れた時点で変換を終了します。
形式 | #include <stdlib.h> double atof(const char *nptr); int atoi(const char *nptr); long atol(const char *nptr); |
---|---|
返り値 | 数値に変換した値を返します。変換出来なかった場合は0を返します。 |
引数 |
|
strtod関数は文字列をdouble型の数値に変換します。atof関数との相違は、指定した文字列が数字でない場合の判別手段が用意されている事です。
変換する文字列の先頭は空白(スペースやタブ、等)でも構いませんし、+や-は正・負の符号とみなします。また、途中の.は小数点とみなします。これらの記号や数字以外が現れた時点で変換を終了します。(「整数.整数E±整数」(Eは小文字も可)の形式もサポートしています)
なお、"INF"または"INFINITY"は無限、"NAN"は計算できない数(not-a-number)とみなします。(大文字小文字は区別しません)
形式 | #include <stdlib.h> double strtod(const char *nptr, char **endptr); |
---|---|
返り値 | 数値に変換した値を返します。変換出来なかった場合は0を返します。 |
引数 |
|
変換結果がオーバーフローまたはアンダーフローを起こした場合には、外部変数errnoにERANGEが設定され、返り値はオーバーフローの場合はHUGE_VALが、アンダーフローの場合は0が返ります。
第1引数で指定した文字列が正常に変換されたか否かは、第2引数で指定したポインタ変数の指し示す文字がヌル文字('\0')かどうかで判別できます。ヌル文字であれば、ヌル文字の前の文字、つまり、文字列の最後の文字までが変換対象になったことになります。
strtol関数は文字列をlong int型の数値に、strtoul関数はunsigned long int型の数値に変換します。strtod関数と同様に、指定した文字列が数字でない場合の判別手段が用意されています。
変換する文字列の先頭は空白(スペースやタブ、等)でも構いませんし、+や-は正・負の符号とみなします。また、'0X'や'0x'で始まる場合は十六進数、0で始まる場合は八進数とみなします。
形式 | #include <stdlib.h> long int strtol(const char *nptr, char **endptr, int base); unsigned long int strtoul(const char *nptr, char **endptr, int base); |
---|---|
返り値 | 数値に変換した値を返します。変換出来なかった場合は0を返します。 |
引数 |
|
変換結果がオーバーフローまたはアンダーフローを起こした場合には、外部変数errnoにERANGEが設定され、返り値は次の値になります。
第1引数で指定した文字列が正常に変換されたか否かは、第2引数で指定したポインタ変数の指し示す文字がヌル文字('\0')かどうかで判別できます。ヌル文字であれば、ヌル文字の前の文字、つまり、文字列の最後の文字までが変換対象になったことになります。
第3引数で0又は16を指定した場合、変換する文字列の先頭に'0X'や'0x'を指定すると十六進数とみなします。また、0を指定して、変換する文字列の先頭に0を指定すると八進数とみなします。
入力した文字列を整数値に変換して表示することを繰り返します。入力文字列として、endを入力したら終了します。
$ ./ex14_7_2.prg 文字列を入力してください ==> 123 123 --> 123 文字列を入力してください ==> +123 +123 --> 123 文字列を入力してください ==> -123 -123 --> -123 文字列を入力してください ==> 123.5 変換できませんでした。 文字列を入力してください ==> 0x1a 0x1a --> 26 文字列を入力してください ==> 012 012 --> 10 文字列を入力してください ==> 345 345 --> 345 文字列を入力してください ==> 34 5 変換できませんでした。 文字列を入力してください ==> 0Z1a 変換できませんでした。 文字列を入力してください ==> 2000000000 2000000000 --> 2000000000 文字列を入力してください ==> 2222222222 変換できませんでした。 文字列を入力してください ==> end $