더북(TheBook)

스트링이 표현하는 숫자가 unsigned long으로 표현할 수 없을 정도로 크다면 이 함수는 ULONG_MAX를 리턴하고 errnoERANGE로 설정한다.

이번에는 strtoul의 기능을 구현한 Strtoul 코드를 살펴보자. 포인터 없이 구현하는 최선의 방법이기도 하다.

 

strtoul.c

60 unsigned long Strtoul(char const s[static 1], unsigned base) {
61   if (base > 36u) { /* 밑인지 검사한다. */
62     errno = EINVAL; /* 규격을 확장한다. */
63     return ULONG_MAX;
64   }
65   size_t i = strspn(s, " \f\n\r\t\v"); /* 공백은 건너뛴다. */
66   bool switchsign = false; /* 부호를 검사한다. */
67   switch (s[i]) {
68   case '-' : switchsign = true;
69   case '+' : ++i;
70   }
71   if (!base || base == 16) { /* 밑을 조정한다. */
72     size_t adj = find_prefix(s, i, "0x");
73     if (!base) base = (unsigned[]){ 10, 8, 16, }[adj];
74     i += adj;
75   }
76   /* 본격적인 변환 작업을 수행한다. */
77   unsigned long ret = Strtoul_inner(s, i, base);
78   return (switchsign) ? -ret : ret;
79 }
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.