Namespaces
Variants

strtoimax, strtoumax

From cppreference.net
< c ‎ | string ‎ | byte
定義先ヘッダ <inttypes.h>
intmax_t strtoimax ( const char * restrict nptr,
char ** restrict endptr, int base ) ;
(1) (C99以降)
uintmax_t strtoumax ( const char * restrict nptr,
char ** restrict endptr, int base ) ;
(2) (C99以降)

nptr が指すバイト文字列の整数値を解釈します。

空白文字( isspace を呼び出すことで識別される)を最初の非空白文字が見つかるまで破棄し、その後有効な base-n (n= base の場合)整数表現を形成するために可能な限りの文字を取得し、それらを整数値に変換します。有効な整数値は以下の部分で構成されます:

  • (オプション) プラスまたはマイナス記号
  • (オプション) プレフィックス( 0 )8進数を示す(基数が 8 または 0 の場合のみ適用)
  • (オプション) プレフィックス( 0x または 0X )16進数を示す(基数が 16 または 0 の場合のみ適用)
  • 数字のシーケンス

基数として有効な値の集合は {0, 2, 3, ..., 36} です。基数 2 の整数で有効な数字の集合は {0, 1} 、基数 3 の整数では {0, 1, 2} となります。このように続きます。 10 より大きい基数の場合、有効な数字にはアルファベット文字が含まれ、基数 11 の整数では Aa から始まり、基数 36 の整数では Zz までとなります。文字の大文字小文字は区別されません。

現在インストールされているCの locale によっては、追加の数値フォーマットが受け入れられる場合があります。

base の値が 0 の場合、数値の基数は自動検出されます:プレフィックスが 0 の場合は8進数、プレフィックスが 0x または 0X の場合は16進数、それ以外の場合は10進数となります。

マイナス記号が入力シーケンスの一部であった場合、数字のシーケンスから計算された数値は、結果の型における 単項マイナス による場合と同様に否定されます。

この関数は、 endptr が指すポインタを、最後に解釈された文字の次の文字を指すように設定します。 endptr がnullポインタの場合、この処理は無視されます。

nptr が空であるか、期待される形式を持たない場合、変換は行われず、( endptr がnullポインタでない場合) nptr の値が endptr が指すオブジェクトに格納されます。

目次

パラメータ

nptr - 解釈対象のヌル終端バイト文字列へのポインタ
endptr - 文字へのポインタを指すポインタ
base - base 解釈される整数値の基数

戻り値

  • 成功した場合、 str の内容に対応する整数値が返されます。
  • 変換された値が対応する戻り値の型の範囲外である場合、範囲エラーが発生し( errno ERANGE に設定)、適切な値として INTMAX_MAX INTMAX_MIN UINTMAX_MAX または 0 が返されます。
  • 変換が実行できない場合、 0 が返されます。

#include <errno.h>
#include <inttypes.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
    char* endptr = NULL;
    printf("%ld\n", strtoimax(" -123junk", &endptr, 10)); // 基数10
    printf("%ld\n", strtoimax("11111111", &endptr, 2));   // 基数2
    printf("%ld\n", strtoimax("XyZ", &endptr, 36));       // 基数36
    printf("%ld\n", strtoimax("010", &endptr, 0));        // 8進数の自動検出
    printf("%ld\n", strtoimax("10", &endptr, 0));         // 10進数の自動検出
    printf("%ld\n", strtoimax("0x10", &endptr, 0));       // 16進数の自動検出
    // 範囲エラー: LONG_MAX+1 --> LONG_MAX
    errno = 0;
    printf("%ld\n", strtoimax("9223372036854775808", &endptr, 10));
    printf("%s\n", strerror(errno));
}

出力:

-123
255
44027
8
10
16
9223372036854775807
Numerical result out of range

参考文献

  • C23規格 (ISO/IEC 9899:2024):
  • 7.8.2.3 strtoimaxおよびstrtoumax関数 (p: TBD)
  • C17規格 (ISO/IEC 9899:2018):
  • 7.8.2.3 strtoimaxおよびstrtoumax関数 (p: TBD)
  • C11標準 (ISO/IEC 9899:2011):
  • 7.8.2.3 strtoimaxおよびstrtoumax関数 (p: 219)
  • C99規格 (ISO/IEC 9899:1999):
  • 7.8.2.3 strtoimaxおよびstrtoumax関数 (p: 200)

関連項目

ワイド文字列を intmax_t または uintmax_t に変換する
(関数)
バイト文字列を整数値に変換する
(関数)
バイト文字列を符号なし整数値に変換する
(関数)
C++ documentation for strtoimax , strtoumax