演習 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; }