【初心者向け】C言語「Strings」ライブラリ:`atoll` 関数で文字列を数値に変換する方法
C言語の「Strings」ライブラリには、文字列を数値に変換する関数 atoll
が用意されています。この関数は、文字列中の数字部分を解析し、整数値に変換します。
使い方
atoll
関数の使い方は次のとおりです。
long atoll(const char *str);
str
: 数値を含む文字列ポインタ
この関数は、成功した場合、文字列中の数字部分を解析した整数値を返します。エラーが発生した場合、0を返します。
例
次のコードは、文字列 "12345" を整数 12345 に変換します。
char str[] = "12345";
long num = atoll(str);
printf("%ld\n", num); // 出力: 12345
注意点
- 文字列中に負の符号がある場合は、正しく解析できません。
- 文字列中にカンマなどの区切り文字を含む場合は、解析できません。
- 文字列の先頭に数字以外の文字列がある場合、0を返します。
atoll
関数は、文字列の先頭から数字以外の文字列に出くわすまで、数字を解析します。
詳細
atoll
関数に関する詳細は、以下のリファレンスを参照してください。
- これらの関数は、それぞれ異なる型に変換するため、使用する関数を選択する必要があります。
- C言語には、文字列を他の型に変換する関数も用意されています。
atoi
: 文字列を整数に変換するatol
: 文字列を長整数に変換するatof
: 文字列を浮動小数点に変換するstrtol
: 文字列を指定した基数に基づいて整数に変換するstrtoul
: 文字列を指定した基数に基づいて長整数に変換するstrtod
: 文字列を指定した基数に基づいて浮動小数点に変換する
例 1: 文字列を整数に変換する
この例では、文字列 "12345" を整数 12345 に変換します。
#include <stdio.h>
#include <stdlib.h>
int main() {
char str[] = "12345";
long num = atoll(str);
printf("%ld\n", num); // 出力: 12345
return 0;
}
例 2: 文字列と数値の合計を出力する
この例では、文字列 "100" と数値 50 を合計し、結果を画面に出力します。
#include <stdio.h>
#include <stdlib.h>
int main() {
char str[] = "100";
long num1 = atoll(str);
int num2 = 50;
long sum = num1 + num2;
printf("%ld\n", sum); // 出力: 150
return 0;
}
例 3: ユーザー入力の数値を atoll
関数を使用して処理する
この例では、ユーザーから数値を入力し、atoll
関数を使用して整数に変換します。その後、変換された数値の2乗を計算し、結果を画面に出力します。
#include <stdio.h>
#include <stdlib.h>
int main() {
char input[100];
printf("数値を入力してください: ");
fgets(input, sizeof(input), stdin);
long num = atoll(input);
long square = num * num;
printf("%ld の2乗は %ld です。\n", num, square);
return 0;
}
これらの例は、atoll
関数の基本的な使用方法を示しています。この関数は、さまざまな状況で使用できます。
atoi
関数は、文字列を整数に変換します。fgets
関数は、標準入力から文字列を読み込みます。
- 文字列中に負の符号がある場合は、正しく解析できません。
- 文字列中にカンマなどの区切り文字を含む場合は、解析できません。
- 文字列の先頭に数字以外の文字列がある場合、0を返します。
これらの制限を回避するために、atoll
関数の代替方法として、以下の方法が考えられます。
方法 1: strtol
関数を使用する
strtol
関数は、文字列を指定した基数に基づいて整数に変換します。この関数は、atoll
関数よりも柔軟性があり、文字列の先頭に数字以外の文字列がある場合や、文字列中にカンマなどの区切り文字を含む場合でも、正しく解析できます。
long strtol(const char *str, char **endptr, int base);
base
: 変換する基数endptr
: 解析が終了した文字列ポインタへのポインタstr
: 数値を含む文字列ポインタ
例
次のコードは、文字列 "123,456" を 10進数に基づいて整数 123456 に変換します。
char str[] = "123,456";
char *endptr;
long num = strtol(str, &endptr, 10);
printf("%ld\n", num); // 出力: 123456
方法 2: 手動で解析する
文字列を数値に変換する必要がある場合は、atoll
関数や strtol
関数を使用する代わりに、手動で解析することもできます。これは、より複雑な解析が必要な場合や、パフォーマンスが重要な場合に役立ちます。
例
char str[] = "12345";
int num = 0;
for (int i = 0; i < strlen(str); i++) {
if (str[i] < '0' || str[i] > '9') {
// エラー処理
}
num = num * 10 + (str[i] - '0');
}
printf("%d\n", num); // 出力: 12345
方法 3: ライブラリを使用する
C言語には、文字列処理を容易にする多くのライブラリが用意されています。これらのライブラリには、atoll
関数や strtol
関数の代替となる関数を含む場合があります。
例
ライブラリには、lexical_cast
関数が用意されています。この関数は、文字列をさまざまな型に変換することができます。
#include <boost/lexical_cast.hpp>
int main() {
std::string str = "12345";
int num = boost::lexical_cast<int>(str);
std::cout << num << std::endl; // 出力: 12345
return 0;
}
atoll
関数は、文字列を整数に変換する便利な関数ですが、いくつかの制限があります。これらの制限を回避するために、strtol
関数を使用したり、手動で解析したり、ライブラリを使用したりすることができます。
どの方法を使用するかは、状況によって異なります。
atoi
関数は、文字列を整数に変換します。fgets
関数は、標準入力から文字列を読み込みます。