strtol() - 文字ストリングの long 型への変換

標準

標準/拡張機能 C/C++ 依存項目

ISO C
XPG4
XPG4.2
C99
Single UNIX Specification、バージョン 3

両方  

形式

#include <stdlib.h>

long int strtol(const char * __restrict__nptr, char ** __restrict__endptr, int base);

機能説明

文字ストリング nptr を、long int 値に変換します。

関数により、ストリング全体が次のような 3 つの部分に分解 されます。
  1. 文字のシーケンス。現行ロケールで空白文字と定義されます。この部分は空の場合があります。
  2. いくつかの基数表記で、整数として解釈される文字の シーケンス。これは、サブジェクト・シーケンス です。
  3. 認識されない文字のシーケンス。
基数がゼロより大きい場合には、基数表記は base に より決まります。基数がゼロの場合には、基数表記は、オプションの正符号または 負符号の後の、文字のシーケンスの形式によって決まります。
10
シーケンスは、ゼロ以外の 10 進数で開始します。
8
シーケンスは 0 で開始し、後ろに 0 ~ 7 の値の数字の シーケンスが続きます。
16
シーケンスは 0x または 0X のどちらか で開始します。後ろには数字、および AF または af の文字が続きます。

基数がゼロより大きい場合には、サブジェクト・シーケンス には、正符号または負符号のどちらかが前にあると考えられる 10 進数字および文字が含まれます。文字 a (または A) ~ z (または Z) により、10 ~ 36 の値が表されますが、基数の値より小さい値の文字だけが許可されます。

strtol() 関数を使用する際には、nptr を使って、次の 形式のストリングを示す必要があります。
構文図を読む構文図をスキップする
>>-+-------------+--+-----+--+----+--+--------+----------------><
   '-white space-'  +- + -+  +-0--+  '-digits-'   
                    '- - -'  +-0x-+               
                             '-0X-'               

endptr が NULL 以外のポインターであるかぎり、変換が たとえ正常に実行されなかったとしても、変換文字のポインターは、endptr で示されるオブジェクトに保管されます。

戻り値

正常に実行された場合、strtol() は、変換後の long int 値を戻します。

正常に実行されなかった場合、変換が実行できないと、strtol() は 0 を戻します。正しい値が表現可能な値の範囲外である場合、strtol() は値の符号に応じて LONG_MAX または LONG_MIN を戻します。基数の値がサポートされない場合、strtol() は 0 を戻します。

正常に実行されなかった場合、strtol() は errno を次のいずれかの 値に設定します。

エラー・コード
説明
EINVAL
base の値はサポートされません。
ERANGE
変換によってオーバーフローが起きました。

CELEBS55
⁄* CELEBS55                                      

   This example converts the strings to a long.                                 
   It prints out the converted value and the substring that                     
   stopped the conversion.                                                      
                                                                                
 *⁄                                                                             
#include <stdlib.h>                                                             
#include <stdio.h>                                                              
                                                                                
int main(void)                                                                  
{                                                                               
   char *string, *stopstring;                                                   
   long l;                                                                      
   int bs;                                                                      
                                                                                
   string = "10110134932";                                                      
   printf("string = %s¥n", string);                                             
   for (bs = 2; bs <= 8; bs *= 2)                                               
   {                                                                            
      l = strtol(string, &stopstring, bs);                                      
      printf("   strtol = %ld (base %d)¥n", l, bs);                             
      printf("   Stopped scan at %s¥n¥n", stopstring);                          
      }                                                                         
}                                                                               
                                                                                
出力:
string = 10110134932
   strtol = 45 (base 2)
   Stopped scan at 34932

   strtol = 4423 (base 4)
   Stopped scan at 4932

   strtol = 2134108 (base 8)
   Stopped scan at 932

関連情報