最終更新日時(UTC):
が更新

履歴 編集

function
<cstdlib>

std::strtol

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

概要

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

endptrが非nullptrの場合、変換が終了した位置の文字へのポインタがそこに格納される。

基数baseは 2~36 または 0 の値を取る。

baseが0の場合

  • 文字列の先頭が0xまたは0Xのときは16進数
  • 文字列の先頭が0のときは8進数
  • その他のときは10進数として変換する。

変換は次のように行われる

  • 先頭が空白文字の場合、最初の非空白文字から変換される。
  • +または-が先頭にある場合は、符号として解釈される。
  • 基数が 16 または 0 の場合0xまたは0Xをスキップする
  • その後の文字列を、指定されたbaseに基づいて整数値に変換する。
  • 各桁は、09をその値、azおよびAZを10〜35として扱う。

戻り値

  • 変換可能ならば変換後の数値。
  • 変換後の数値がlongの範囲外の場合、LONG_MAXまたは LONG_MIN
  • 変換不可能なら0を返す。

備考

  • 数値が long の範囲を超えるときは errnoERANGE が設定される。

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

void convert_and_print(const char* str, int base) {
  errno = 0;
  char* end = nullptr;
  long result = std::strtol(str, &end, base);

  std::cout << "基数" << base << "での変換結果: " << result << std::endl;
  if (str == end) {
    std::cout << "変換不可" << std::endl;
  } else if (errno == ERANGE) {
    std::cout << "  → 変換結果が範囲外" << std::endl;
  }
  if (*end != '\0') {
    std::cout << "未変換部分: \"" << end << "\"" << std::endl;
  }
  std::cout << std::endl;
}

int main() {
  const char* str = "  -0x2Fabc";
  convert_and_print(str, 0);   // 自動判別
  convert_and_print(str, 10);  // 10進数
  convert_and_print(str, 36);  // 36進数

  return 0;
}

出力

基数0での変換結果: -195260

基数10での変換結果: 0
未変換部分: "x2Fabc"

基数36での変換結果: -1999456248

関連項目

  • strtoll: 文字列を、基数を指定してlong long型に変換する
  • strtoul: 文字列を、基数を指定してunsigned long型に変換する
  • strtoull: 文字列を、基数を指定してunsigned long long型に変換する
  • std::stol: 文字列からlong型への変換
  • <charconv> ヘッダ: 高速な文字列 ⇔ 数値変換

参考文献