namespace std {
long long int strtoll(const char* nptr, char** endptr, int base);
}
概要
文字列nptrをlong long型の整数に変換する。文字列はbaseで指定された基数に従って解釈される。
解釈の規則はstrtol()と同じであり、変換先の型がlong longである点のみが異なる。
endptrが非nullptrの場合、変換が終了した位置の文字へのポインタがそこに格納される- 基数
baseは2〜36、または0の値をとる。0の場合は、0x/0Xで始まれば16進数、0で始まれば8進数、それ以外は10進数として解釈される
戻り値
- 変換可能ならば変換後の数値を返す
- 変換後の数値が
long longの範囲外の場合、LLONG_MAXまたはLLONG_MINを返し、errnoにERANGEを設定する - 変換不可能ならば
0を返す
備考
- 変換できたかどうかは、戻り値ではなく
endptrがnptrから進んだかどうかで判定する。変換不可能な場合と、文字列が"0"である場合を、戻り値では区別できないためです - 例外を送出する
std::stoll()や、ロケールに依存しないstd::from_chars()(C++17)も使用できる
例
#include <iostream>
#include <cstdlib>
#include <cerrno>
int main()
{
char* end = nullptr;
// 16進数として変換する
long long a = std::strtoll("ff", &end, 16);
std::cout << a << std::endl;
// 変換できない場合、endは入力文字列の先頭のまま
const char* input = "abc";
std::strtoll(input, &end, 10);
std::cout << (end == input) << std::endl;
// 範囲外の場合
errno = 0;
std::strtoll("99999999999999999999999999", &end, 10);
std::cout << (errno == ERANGE) << std::endl;
}
出力
255
1
1
処理系
- Clang: 3.4 ✅
- GCC: 4.7.1 ✅
- Visual C++: 2019 ✅
備考
- 動作確認した範囲での最小バージョンを記載している。Clangは3.4(Compiler Explorerで利用できる最古のバージョン)、Visual C++は2019(同左)で動作を確認しており、それ以前のバージョンでも使用できる可能性がある