• ベストアンサー

文字列→数値変換ルーチン

こんにちは。 16進数の文字列を数値に変換するルーチンを調査したところ、以下のサイトを発見することができました。 http://www.cisnet.or.jp/home/tsuneoka/win32sub/appendex.html ただし、このサイトのルーチンはDOS用に作成されているため、int = 16bit が前提になっており、変換するとき、0x7fffffff より大きい値(0xfffffffe)は変換できません。 このサイトのルーチンを改造して、変換可能な最大値を符号なし32bit(0xffffffff)にするには、どうしたらよいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

標準関数の stdlib.h strtoul を使いましょう。(何か理由があれば別ですが) サンプル #include <stdio.h> #include <stdlib.h> void main(void){ unsigned long x; char *HEXSTR="FFFFFFFF"; char *endp; x=strtoul(HEXSTR, &endp,16); printf("%X\n",x); x=strtoul("0xF0F0F0F0", &endp,16); printf("%X\n",x); }

kerberos_001
質問者

お礼

ご回答ありがとうございます。 なるほど~便利な関数があったのですね~ どうもありがとうございました!!

その他の回答 (2)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

#2の方の回答に補足します。 まず、nptrやbaseがいきなり出てきていますが、 unsigned long strtoul(const char *nptr, char **endptr, int base); ということですね。 以下、これに乗っかって説明します。 エラーの検出方法ですが、文字列全体が変換対象になったかどうかを調べるには、**endptr が '\0' であることを調べれば可能です。また、オーバーフローについては errno の値を調べれば分かります(事前に errno を 0 にしておくことをお忘れなく)。

kerberos_001
質問者

お礼

ご回答ありがとうございます。 補足ありがとうございます。 大変分かりやすいです。 ありがとうございました!

  • keroro001
  • ベストアンサー率23% (71/304)
回答No.2

基本的に問題なければ#1の人のstrtoul関数を使うべきでしょう。 ただし、(以下ヘルプ抜粋) strtoul 関数は、nptr が以下の形式の文字列を指すものと想定しています。 [whitespace] [{+ | -}] [0 [{ x | X }]] [digits] whitespace とはスペースかタブのことで、これらは無視されます。digits は 1 つ以上の 10 進数字です。この形式に一致しない最初の文字で走査は停止します。base は、2 から 36 の間の数値であると、基数として使われます。base が 0 であると、nptr が指す文字列の先頭の文字で基数を判定します。最初の文字が 0 で、2 番目の文字が 'x' または 'X' 以外であると、文字列は 8 進整数と解釈されます。それ以外の場合は、10 進数と解釈されます。最初の文字が '0' で、2 番目の文字が 'x' または 'X' であると、文字列は 16 進整数と解釈されます。最初の文字が '1' から '9' までの数値であると、文字列は 10 進整数と解釈されます。'a' から 'z' (または 'A' から 'Z') までの文字は、10 から 35 までの値に割り当てます。数値として使える文字は base よりも小さい値が割り当てられている文字だけです。 ということですので、適当な文字を入力しても変換されちまうようなので、厳密にエラーを返したい場合は入力文字列のチェックが必要かと。 あとはオーバーフロー、アンダーフロー時の処理。 そして、エラーコードが戻り値で渡せなくなるので、他の方法を考えないといけませんね。

kerberos_001
質問者

お礼

ご回答ありがとうございます。 なるほど~便利な関数があったのですね~ どうもありがとうございました!!

関連するQ&A

専門家に質問してみよう