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);
}