最終更新日時:
が更新

履歴 編集

function
<cstdlib>

std::strtoull(C++11)

namespace std {
  unsigned long long int strtoull(const char* nptr, char** endptr, int base);
}

概要

文字列nptrunsigned long long型の整数に変換する。文字列はbaseで指定された基数に従って解釈される。

解釈の規則はstrtol()と同じであり、変換先の型がunsigned long longである点のみが異なる。

  • endptrが非nullptrの場合、変換が終了した位置の文字へのポインタがそこに格納される
  • 基数baseは2〜36、または0の値をとる。0の場合は、0x0Xで始まれば16進数、0で始まれば8進数、それ以外は10進数として解釈される

戻り値

  • 変換可能ならば変換後の数値を返す
  • 変換後の数値がunsigned long longの範囲外の場合、ULLONG_MAXを返し、errnoERANGEを設定する
  • 変換不可能ならば0を返す

備考

  • 変換できたかどうかは、戻り値ではなくendptrnptrから進んだかどうかで判定する。変換不可能な場合と、文字列が"0"である場合を、戻り値では区別できないためです
  • 負の符号が付いた文字列も変換され、その値の符号を反転した結果が返る。たとえば"-1"は最大値へ変換される
  • 例外を送出するstd::stoull()や、ロケールに依存しないstd::from_chars()(C++17)も使用できる

#include <iostream>
#include <cstdlib>
#include <cerrno>

int main()
{
  char* end = nullptr;

  // 16進数として変換する
  unsigned long long a = std::strtoull("ff", &end, 16);
  std::cout << a << std::endl;

  // 変換できない場合、endは入力文字列の先頭のまま
  const char* input = "abc";
  std::strtoull(input, &end, 10);
  std::cout << (end == input) << std::endl;

  // 範囲外の場合
  errno = 0;
  std::strtoull("99999999999999999999999999", &end, 10);
  std::cout << (errno == ERANGE) << std::endl;
}

出力

255
1
1

処理系

備考

  • 動作確認した範囲での最小バージョンを記載している。Clangは3.4(Compiler Explorerで利用できる最古のバージョン)、Visual C++は2019(同左)で動作を確認しており、それ以前のバージョンでも使用できる可能性がある

関連項目