最終更新日時:
が更新

履歴 編集

function
<cstdlib>

std::strtoll(C++11)

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

概要

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

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

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

戻り値

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

備考

  • 変換できたかどうかは、戻り値ではなくendptrnptrから進んだかどうかで判定する。変換不可能な場合と、文字列が"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(Compiler Explorerで利用できる最古のバージョン)、Visual C++は2019(同左)で動作を確認しており、それ以前のバージョンでも使用できる可能性がある

関連項目