- ベストアンサー
16進数を入力とするatoi関数の作り方
ライブラリを使用せずに、16進数を入力とするatoi関数はどうすれば作れますか? (関数のはじめは「int my_atoi16(const char *str)」で始まります。」 本に載ってる問題なのですが、答えをなくしてしまったので、困ってます。 どなたかお願いします!!
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
既に回答されている通り…です。 強いてあげればa~fはA~Fと大文字で渡される可能性も考慮した方がいい。ってところでしょうか。 実装方法は何通りかありますかねぇ。 # 文字コード利用する方法がたぶん普通でしょうが。
その他の回答 (2)
ASCIIコード前提でよければ、下のようなコードで足りるでしょう。 表引きにすると、もう少しスマートに作れる気がしますが。 #define is_hex(c) \ (c>='0' && c<='9') || (c>='a' && c<='f') || (c>='A' && c<='F') #define hex2num(hex, num, min, max, up) \ if ((hex>=min) && (hex<=max)) num = num * 16 + up + hex - min int my_atoi16(const char *str) { int val = 0; int sign; if (str) { sign = (*str == '-') ? -1 : 1; int i = (*str == '-' || *str == '+') ? 1 : 0; while (is_hex(str[i])) { hex2num(str[i], val, '0', '9', 0); hex2num(str[i], val, 'a', 'f', 10); hex2num(str[i], val, 'A', 'F', 10); i++; } } return sign * val; }
- wormhole
- ベストアンサー率28% (1626/5665)
a→10 b→11 c→12 d→13 e→14 f→15 16で桁上がり で処理すればいいだけです。それ以外の作りは10進数の場合と変わりありません。