演習 2-3

無職の間にK&Rを再読。演習問題の解答をさらす。解く順番は適当。

演習 2-3
16進数の文字列( 0x あるいは 0X が付いているものも含めて)をそれと同値な整数値へ変換する関数 htoi(s) を書け。許される文字は 0 から 9 と a から f および A から F である。


Exercise 2-3
Write the function htoi(s), which converts a string of hexadecimal digits (including an optional 0x or 0X) into its equivalent integer value. The allowable digits are 0 through 9, a through f, and A through F.


ちゃんと作ったはずなのに、確認動作がおかしいとおもったら、0x01 のゼロがオーになっていた。最近この織田祐二的な打ち間違いが多い。

#include <stdio.h>

/* Answer */
int htoi(const char s[])
{
  int ret, i;

  ret = i = 0;

  if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
    i = 2;
  
  int n;
  for(; s[i] != '\0'; i++) {
    if (s[i] >= '0' && s[i] <= '9')
      n = s[i] - '0';
    else if (s[i] >= 'a' && s[i] <= 'f')
      n = s[i] - 'a' + 10;
    else if (s[i] >= 'A' && s[i] <= 'F')
      n = s[i] - 'A' + 10;
    else
      break;

    ret = ret * 16 + n;
  }
  
  return ret;
}



int main(void)
{
  printf("0x1234 = %x \n", htoi("0x1234"));
  printf("0x01   = %x \n", htoi("0x01")  );
  printf("0XEDEC = %x \n", htoi("0XEDEC"));
  printf("0x01   = %x \n", htoi("0x01")  );
  printf("xCCFD  = %x \n", htoi("xCCFD") );
  printf("034    = %x \n", htoi("034")   );
  printf("0x12XL = %x \n", htoi("0x12XL"));
  printf("0xdFa5 = %x \n", htoi("0xdFa5"));
  
  return 0;
}