プログラミング言語 C 問 2.3


Cを勉強する必要が出てきたので、再勉強。

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<assert.h>

static int htoi (char *s);
static void test_htoi(void);

int
main(int argc, char **argv)
{
     int answer;

     if (argc != 2) {
          fprintf(stderr, "Invalid argument number\n");
          exit(1);
     }

     test_htoi();
     answer = htoi(argv[1]);

     printf("%s = %d\n", argv[1], answer);

     return 0;
}

static void
test_htoi()
{
     assert(htoi("0") == 0);
     assert(htoi("1") == 1);
     assert(htoi("0x0") == 0);
     assert(htoi("0x01") == 0x1);
     assert(htoi("0xa") == 0xa);
     assert(htoi("0xb") == 0xb);
     assert(htoi("0xc") == 0xc);
     assert(htoi("0xd") == 0xd);
     assert(htoi("0xe") == 0xe);
     assert(htoi("0xf") == 0xf);
     assert(htoi("0xA") == 0xA);
     assert(htoi("0xB") == 0xB);
     assert(htoi("0xC") == 0xC);
     assert(htoi("0xD") == 0xD);
     assert(htoi("0xE") == 0xE);
     assert(htoi("0xF") == 0xF);
     assert(htoi("0XF") == 0XF);
     assert(htoi("0XFF") == 0xFF);
     assert(htoi("0XFFF") == 0XFFF);
     assert(htoi("0XFFFF") == 0XFFFF);
     assert(htoi("0XFFFFF") == 0XFFFFF);
     assert(htoi("0XFFFFFF") == 0xFFFFFF);
     assert(htoi("0XFFFFFFF") == 0xFFFFFFF);
}

static int
htoi (char *s)
{
     int base;
     int index;

     int sum, num, tmp;

     sum = 0;

     base = 10;  /* decimal number */
     index = 0;

     if (s[0] == '0' && tolower(s[1]) == 'x') {
          base = 16; /* hex decimal */
          index = 2;
     }

     while (s[index] != '\0') {
          tmp = tolower(s[index]);

          if (tmp >= 'a' && tmp <= 'f') {
               num = tmp - 'a' + 10;
          }
          else if (tmp >= '0' && tmp <= '9'){
               num = tmp - '0';
          }
          else {
               return sum; /* find invalid character */
          }

          sum = (sum * base) + num;
          index++;
     }