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'が変換不可 ※緑字はキーボードからの入力
▼戻る▼
「初心者のためのポイント学習C言語」 Copyright(c) 2000-2004 TOMOJI All Rights Reserved