アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは。

16進数の文字列を数値に変換するルーチンを調査したところ、以下のサイトを発見することができました。
http://www.cisnet.or.jp/home/tsuneoka/win32sub/a …

ただし、このサイトのルーチンはDOS用に作成されているため、int = 16bit が前提になっており、変換するとき、0x7fffffff より大きい値(0xfffffffe)は変換できません。

このサイトのルーチンを改造して、変換可能な最大値を符号なし32bit(0xffffffff)にするには、どうしたらよいのでしょうか?

A 回答 (3件)

標準関数の


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);
}
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

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

お礼日時:2005/04/27 10:13

#2の方の回答に補足します。



まず、nptrやbaseがいきなり出てきていますが、

unsigned long strtoul(const char *nptr, char **endptr, int base);

ということですね。
以下、これに乗っかって説明します。

エラーの検出方法ですが、文字列全体が変換対象になったかどうかを調べるには、**endptr が '\0' であることを調べれば可能です。また、オーバーフローについては errno の値を調べれば分かります(事前に errno を 0 にしておくことをお忘れなく)。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

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

お礼日時:2005/04/27 10:24

基本的に問題なければ#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 よりも小さい値が割り当てられている文字だけです。

ということですので、適当な文字を入力しても変換されちまうようなので、厳密にエラーを返したい場合は入力文字列のチェックが必要かと。
あとはオーバーフロー、アンダーフロー時の処理。
そして、エラーコードが戻り値で渡せなくなるので、他の方法を考えないといけませんね。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

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

お礼日時:2005/04/27 10:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!