【初心者向け】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 関数は、標準入力から文字列を読み込みます。