strtoul

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

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

【説明】
文字列 s を、baseで指定された基数でunsigned long型に変換し返却します。このとき、文字列中に変換不可能 な文字があった場合には、その文字列のポインタをendptrに格納します。
atol関数は、単に文字列を10進のlong型変数に変換するのみで、文字列中に変換不可能な文字があった ときには対応できませんが、strtoulを使うと、変換可能な部分についてはきちんと変換し、変換不可能な 部分についても情報を得ることができます。更に、baseを指定することにより、好きな基数で変換す ることができます。
結果がunsigned longで、エラー値がULONG_MAXである点を除けば、strtolと同じです。
【引数】
const char *s : 変換対象文字列。
書式は[空白類文字][符号+][0][x][数値列]。このとき、[]内は省略可能。
また、符号(-)と接尾語(L/l/U/u)は含まない。
(例)un = strtoul(" +77", NULL, 10); printf("un=%lu\n", un);
(結果)un=77 … " +77"を10進数として変換

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

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

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

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

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

※正しい値が表現可能な値の範囲外であるとき、ULONG_MAXを返し、errnoにはマクロERANGEの値を格納する。

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

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

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

戻る


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