C言語関数:strtol





C言語のページでは、次の内容を解説しております。
C言語の入門講座  C言語の文法を中心に、基本的な関数などの解説をしています。
C言語ケーススタディ  C言語での実践的なプログラミングについて解説をしています。
C言語の関数リファレンス  C言語で用意されている関数を解説しています。
C言語で3次元動画プログラム  C言語で3次元タートルグラフィックを使用した3次元の動画プログラムの作成例です。
C言語の検定試験  C言語の文法に関する検定試験を実施することができます。
C言語でゲーム作成  C言語を使用したゲームの作り方を解説したページも用意しております。



2014年10月より個人の方を対象に、Study C無料提供を開始しました。
C言語を勉強中の方は、学習・教育に最適なC言語インタープリタのStudy Cを使ってみてください(個人の方は無料です)。
大学・高専・高校などの教育機関での採用実績も多数あるロングセラー商品Study Cが、個人向けに無料提供を始めました。
インタープリタの手軽さに加え、ゲームや3Dタートルグラフィックで楽しく勉強したりと、C言語の学習を協力にサポートします。
ブロック崩しゲーム 3Dツリー クリスマスツリー
また、このようなボタンの用意されているページでは、掲載しているプログラムをStudy Cに直接ロードし実行したりすることができます。
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する
Study C無料利用についての詳細は、このページを参照してください。




■strtol
文字列をlong型の値に変換

【分類】
文字列関数

【書式】
long strtol(const char *s, char **endp, int base);

【パラメータの型と説明】

パラメータ説明
const char *s変換する文字列
char **endp変換終了位置
int base基数

【機能説明】

文字列sをbase進数の数字列と見なしてlong型の値に変換し、その値を返します。
数値として解釈できない文字があると、そのアドレスをendpに代入します。
endpにNULLを指定した場合は、代入されません。

baseに0を指定した場合は、変換する先頭の文字列で何進数か判断します。
1文字目が0、2文字目が1から7の場合は8進数として変換します。 また、1文字目が0、2文字目がxかXの場合は16進数として変換します。

Study Cを使用している場合は、下記のようにコマンドラインから実行(exprコマンドを使用)して動作を確認することができます。 ただし、コマンドラインでは変数が作れないのでendpには0(NULL)を指定する必要があります。 また、マクロ定義も使用できないのでNULLではなく0を指定しなければなりません。

C:\StudyC\MyProg>expr strtol("1234", 0, 10)
<long>1234 0x4d2

C:\StudyC\MyProg>expr strtol("123456xxx", 0, 10)
<long>123456 0x1e240

C:\StudyC\MyProg>expr strtol("012", 0, 0)
<long>10 0xa

C:\StudyC\MyProg>expr strtol("0x10", 0, 0)
<long>16 0x10

C:\StudyC\MyProg>expr strtol("20", 0, 16)
<long>32 0x20

※↑カーソルキーを押すと入力したコマンドが呼び出されるので文字を変更して試してみてください。
1番目は"1234"を10進数として変換し1234が返されます。
2番目は"123456xxx"の"123456"までが10進数として変換され123456が返されます。endpが0なのでどこまでが変換対象かは判別できません。
3番目は"012"を8進数として変換し10が返されます。
4番目は"0x10"を16進数として変換し16が返されます。
5番目は"0x20"を16進数として変換し32が返されます。

通常のコンパイラを使用する場合の使用例は下記になります(もちろんStudy CでもOKです)。

#include <stdio.h>

main()
{
        char *endp;
        char *str;
        long value;

        str = "1234";
        value = strtol(str, &endp, 10);
        printf("%s[%s] - %ld\n", str, endp, value);

        str = "123456xxx";
        value = strtol(str, &endp, 10);
        printf("%s[%s] - %ld\n", str, endp, value);

        str = "012";
        value = strtol(str, &endp, 0);
        printf("%s[%s] - %ld\n", str, endp, value);

        str = "0x10";
        value = strtol(str, &endp, 0);
        printf("%s[%s] - %ld\n", str, endp, value);

        str = "20";
        value = strtol(str, &endp, 16);
        printf("%s[%s] - %ld\n", str, endp, value);
}

実行結果は以下になります。

1234[] - 1234
123456xxx[xxx] - 123456
012[] - 10
0x10[] - 16
20[] - 32

1番目は10進数で1234を変換しています(基数は10)。
2番目は123456xxxを10進数として変換しています(基数は10)。
最後のxxxは変換対象とならないのでendpにxxxが返されます(基数は10)。
3番目は012を8進数として変換しています(基数は0)。
4番目は0x10を16進数として変換しています(基数は0)。
5番目は20を16進数として変換しています(基数は16)。

strtol()関数のendpは通常文字列の最後を指し示しています。 つまり、「if (*endp == '\0')」であれば、与えられた文字列が全て変換できたということになります。

atoi()atol()関数は満足なエラーチェックができません。 strtol()やstrtoul()などを使用しましょう。

【参照関数】
strtod
strtoul