namespace std {
long int strtol(const char* nptr, char** endptr, int base);
}
概要
文字列nptrをlong型の整数に変換する。文字列はbaseで指定された基数に従って解釈される。
endptrが非nullptrの場合、変換が終了した位置の文字へのポインタがそこに格納される。
基数baseは 2~36 または 0 の値を取る。
baseが0の場合
- 文字列の先頭が
0xまたは0Xのときは16進数 - 文字列の先頭が
0のときは8進数 - その他のときは10進数として変換する。
変換は次のように行われる
- 先頭が空白文字の場合、最初の非空白文字から変換される。
+または-が先頭にある場合は、符号として解釈される。- 基数が 16 または 0 の場合
0xまたは0Xをスキップする - その後の文字列を、指定された
baseに基づいて整数値に変換する。 - 各桁は、
0〜9をその値、a〜zおよびA〜Zを10〜35として扱う。
戻り値
- 変換可能ならば変換後の数値。
- 変換後の数値が
longの範囲外の場合、LONG_MAXまたはLONG_MIN。 - 変換不可能なら
0を返す。
備考
- 数値が
longの範囲を超えるときはerrnoにERANGEが設定される。
例
#include <iostream>
#include <cstdlib>
#include <cerrno>
#include <climits>
void convert_and_print(const char* str, int base) {
errno = 0;
char* end = nullptr;
long result = std::strtol(str, &end, base);
std::cout << "基数" << base << "での変換結果: " << result << std::endl;
if (str == end) {
std::cout << "変換不可" << std::endl;
} else if (errno == ERANGE) {
std::cout << " → 変換結果が範囲外" << std::endl;
}
if (*end != '\0') {
std::cout << "未変換部分: \"" << end << "\"" << std::endl;
}
std::cout << std::endl;
}
int main() {
const char* str = " -0x2Fabc";
convert_and_print(str, 0); // 自動判別
convert_and_print(str, 10); // 10進数
convert_and_print(str, 36); // 36進数
return 0;
}
出力
基数0での変換結果: -195260
基数10での変換結果: 0
未変換部分: "x2Fabc"
基数36での変換結果: -1999456248
関連項目
strtoll: 文字列を、基数を指定してlong long型に変換するstrtoul: 文字列を、基数を指定してunsigned long型に変換するstrtoull: 文字列を、基数を指定してunsigned long long型に変換するstd::stol: 文字列からlong型への変換<charconv>ヘッダ: 高速な文字列 ⇔ 数値変換
参考文献
- C言語で安全に標準入力から数値を取得 #stdin - Qiita: Cのstrtolの使い方とendptrの活用例