最終更新日時:
が更新

履歴 編集

function
<cstdlib>

std::strtoul

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

概要

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

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

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

戻り値

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

備考

  • 変換できたかどうかは、戻り値ではなくendptrnptrから進んだかどうかで判定する。変換不可能な場合と、文字列が"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

関連項目