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

ライブラリを使用せずに、16進数を入力とするatoi関数はどうすれば作れますか?

(関数のはじめは「int my_atoi16(const char *str)」で始まります。」

本に載ってる問題なのですが、答えをなくしてしまったので、困ってます。

どなたかお願いします!!

A 回答 (3件)

既に回答されている通り…です。



強いてあげればa~fはA~Fと大文字で渡される可能性も考慮した方がいい。ってところでしょうか。

実装方法は何通りかありますかねぇ。
# 文字コード利用する方法がたぶん普通でしょうが。
    • good
    • 0

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;
}
    • good
    • 0

a→10


b→11
c→12
d→13
e→14
f→15
16で桁上がり

で処理すればいいだけです。それ以外の作りは10進数の場合と変わりありません。
    • good
    • 0

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