strtol

文字列をlong値に変換(エラー検出、基数指定あり)

【書式】
#include <stdlib.h>
long strtol(const char *s, char **endptr, int base);

【説明】
文字列 s を、baseで指定された基数でlong型に変換し返却します。このとき、文字列中に変換不可能 な文字があった場合には、その文字列のポインタをendptrに格納します。
atol関数は、単に文字列を10進のlong型変数に変換するのみで、文字列中に変換不可能な文字があった ときには対応できませんが、strtolを使うと、変換可能な部分についてはきちんと変換し、変換不可能な 部分についても情報を得ることができます。更に、baseを指定することにより、好きな基数で変換す ることができます。

【引数】
const char *s : 変換対象文字列。
書式は[空白類文字][符号+-][0][x][数値列]。このとき、[]内は省略可能。
また、接尾語(L/l)は含まない。
(例)n = strtol(" -77", NULL, 8); printf("n=%ld\n", n);
(結果)n=-63 … " -77"を8進数として変換

char **endptr : 変換不可能な文字列へのポインタの格納先。
(例)n = strtol("77ABC", &e, 8); printf("n=%ld e=%s\n", n, e);
(結果)n=63 e=ABC … "77"を8進で変換。"ABC"は変換不可能

NULLの場合には、変換不可能な文字列への処理は行わない。
(例)n = strtol("77ABC", NULL, 8); printf("n=%ld\n", n);
(結果)n=63 … "77"を8進で変換。"ABC"は捨てる

int base : 基数。
= 0 :Cの定数表記に従う。つまり、0が先頭なら8進数、0xまたは0Xが先頭なら
   16進数。それ以外なら10進数。
(例)n = strtol("077ABC", &e, 0); printf("n=%ld e=%s\n", n, e);
(結果)n=63 e=ABC … "077"を8進で変換。"ABC"は変換不可能

= 2 〜 36 :それぞれの基数。つまり5なら5進数で変換。
(例)n = strtol("123456", &e, 5); printf("n=%ld e=%s\n", n, e);
(結果)n=194 e=56 … "1234"を5進で変換。"56"は変換不可能

【戻り値】
成功時 : s の値をlongで返却。
失敗時 : 0
(例)n = strtol("ABCDEF", &e, 0); printf("n=%ld e=%s\n", n, e);
(結果)n=0 e=ABCDEF … "ABCDEF"は10進変換できない

※正しい値が表現可能な値の範囲外であるとき、値の符号に従って、LONG_MAXまたはLONG_MINを返し、 errnoにはマクロERANGEの値を格納する。

【使用例】
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>    /* ERANGEを使用するために必要 */
#include <limits.h>   /* LONG_MAXとLONG_MINを使用するために必要 */

int main(void)
{
	char s[128], *e;
	long n;
	int base;
	
	printf("何進数で変換しますか。");
	scanf("%d", &base);
	printf("変換する数値を入力してください。");
	scanf("%s", s);
	
	n = strtol(s, &e, base);
	
	if (errno != ERANGE) {
		printf("変換数値=%ld\n", n);
		if (*e != '\0') {
			printf("変換不可能部分=%s\n", e);
			printf("%d文字目の\'%c\'が変換不可\n", e-s+1, *e);
		}
	}
	else if (n == LONG_MAX)
		printf("long値で表現できる値を上回りました。\n");
	else if (n == LONG_MIN)
		printf("long値で表現できる値を下回りました。\n");
	
	return 0;
}
【実行結果例1】
何進数で変換しますか。2
変換する数値を入力してください。111211
変換数値=7
変換不可能部分=211
4文字目の'2'が変換不可

※緑字はキーボードからの入力

戻る


banner
初心者のためのポイント学習C言語」
Copyright(c) 2000-2004 TOMOJI All Rights Reserved