namespace std {
unsigned long int strtoul(const char* nptr, char** endptr, int base);
}
概要
文字列nptrをunsigned long型の整数に変換する。文字列はbaseで指定された基数に従って解釈される。
解釈の規則はstrtol()と同じであり、変換先の型がunsigned longである点のみが異なる。
endptrが非nullptrの場合、変換が終了した位置の文字へのポインタがそこに格納される- 基数
baseは2〜36、または0の値をとる。0の場合は、0x/0Xで始まれば16進数、0で始まれば8進数、それ以外は10進数として解釈される
戻り値
- 変換可能ならば変換後の数値を返す
- 変換後の数値が
unsigned longの範囲外の場合、ULONG_MAXを返し、errnoにERANGEを設定する - 変換不可能ならば
0を返す
備考
- 変換できたかどうかは、戻り値ではなく
endptrがnptrから進んだかどうかで判定する。変換不可能な場合と、文字列が"0"である場合を、戻り値では区別できないためです - 負の符号が付いた文字列も変換され、その値の符号を反転した結果が返る。たとえば
"-1"は最大値へ変換される - 例外を送出する
std::stoul()や、ロケールに依存しないstd::from_chars()(C++17)も使用できる
例
#include <iostream>
#include <cstdlib>
#include <cerrno>
int main()
{
char* end = nullptr;
// 16進数として変換する
unsigned long a = std::strtoul("ff", &end, 16);
std::cout << a << std::endl;
// 変換できない場合、endは入力文字列の先頭のまま
const char* input = "abc";
std::strtoul(input, &end, 10);
std::cout << (end == input) << std::endl;
// 範囲外の場合
errno = 0;
std::strtoul("99999999999999999999999999", &end, 10);
std::cout << (errno == ERANGE) << std::endl;
}
出力
255
1
1