C 言語で Char*を Int に変換

胡金庫 2023年10月12日
  1. C 言語で char*int に変換するには strtol 関数を利用する
  2. C 言語で char*int に変換するための strtol 関数の結果を適切に検証する
C 言語で Char*を Int に変換

この記事では、C 言語で char* を int に変換する方法をいくつか説明します。

C 言語で char*int に変換するには strtol 関数を利用する

関数 strtol は C 標準ライブラリの一部であり、char* データをユーザが指定した長整数値に変換することができる。この関数は 3つの引数を取り、最初の引数は文字列の位置を示すポインタです。この char ポインタの引数は変更されず、const 修飾子を持つことに注意してください。2 番目の引数は、最初に見つかった無効な文字を格納するために利用することができ、桁が見つからなかった場合は文字列全体を格納することができます。第 3 引数は変換される数値の基底を指定し、この引数の値は 2 から 36 の間でなければなりません。次の例は、char* 配列の要素を整数に変換してコンソールに出力する方法を示しています。

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

void printIntegers(long int arr[], size_t size) {
  for (size_t i = 0; i < size; i++) printf("%4ld | ", arr[i]);
  printf("\n");
}

int main(int argc, char *argv[]) {
  char *arr[] = {"12", "33", "43", "23", "90"};

  size_t len = sizeof arr / sizeof arr[0];
  long int arr3[len];
  for (int i = 0; i < len; ++i) {
    arr3[i] = strtol(arr[i], NULL, 10);
  }
  printIntegers(arr3, len);

  exit(EXIT_SUCCESS);
}

出力:

12 |   33 |   43 |   23 |   90 |

別の方法として、プログラムの引数を入力文字列として受け取り、それらを整数型に変換することもできます。プログラムの引数にアクセスして処理するには、main 関数のパラメータとして int argc, char* argv[] を使う必要があることに注意してください。次のサンプルコードでは、ユーザがプログラムに少なくとも 1つの引数を提供したかどうかを調べ、提供されなかった場合はエラーメッセージを表示して終了します。

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

void printIntegers(long int arr[], size_t size) {
  for (size_t i = 0; i < size; i++) printf("%4ld | ", arr[i]);
  printf("\n");
}

int main(int argc, char *argv[]) {
  if (argc < 2) {
    printf("Usage: ./%s int1 int2 int3...\n", argv[0]);
    exit(EXIT_FAILURE);
  }

  long int arr2[argc - 1];
  for (int i = 0; i < argc - 1; ++i) {
    arr2[i] = strtol(argv[i + 1], NULL, 10);
  }
  printIntegers(arr2, argc - 1);

  exit(EXIT_SUCCESS);
}

C 言語で char*int に変換するための strtol 関数の結果を適切に検証する

前の例ではプログラムの引数として渡された文字列を整数に変換するために strtol 呼び出しをうまく使ったが、与えられたプログラムが失敗する可能性が高い。堅牢なプログラムの実行とそれに伴うエラーロギングを保証するために、strtol 関数呼び出しのエラーチェックルーチンを実装することをお勧めします。変換された整数が long 型の範囲内にあるかどうか、また変換自体が失敗したかどうかをチェックします。さらに、有効な整数の後に文字があるかどうか、与えられた入力が 10 進数であるかどうかもチェックします。ただし、エラーメッセージを stderr ストリームに出力してプログラムを終了させないことに注意してください。

#include <errno.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void printIntegers(long int arr[], size_t size) {
  for (size_t i = 0; i < size; i++) printf("%4ld | ", arr[i]);
  printf("\n");
}

int main(int argc, char *argv[]) {
  if (argc < 2) {
    printf("Usage: ./%s int1 int2 int3...\n", argv[0]);
    exit(EXIT_FAILURE);
  }

  long int num;
  char *endptr, *str = argv[1];
  errno = 0;
  long ret = strtol(str, &endptr, 10);

  if (str == endptr) {
    fprintf(stderr, "%s: not a decimal number\n", str);
  } else if ('\0' != *endptr) {
    fprintf(stderr, "%s: extra characters at end of input: %s\n", str, endptr);
  } else if ((LONG_MIN == ret || LONG_MAX == ret) && ERANGE == errno) {
    fprintf(stderr, "%s out of range of type long\n", str);
  } else if (errno != 0 && ret == 0) {
    fprintf(stderr, "%s no conversion was performed\n", str);
  } else {
    num = ret;
    printf("num: %ld\n", num);
  }

  exit(EXIT_SUCCESS);
}
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C Integer