문자를 숫자로 바꾸어 주는 함수는 atoi()이고 stdlib.h에 들어있다. 이는 표준 함수이고 자주 쓰이도 한다. 반대로 숫자를 문자로 바꾸어 주는 함수는 itoa()인데 이는 비표준 함수여서 MS계열인 Visual Studio에서는 쓸 수 있지만 보든 환경에서 쓸 수 있다고는 보장할 수 없다.
이 두 함수들은 정수들 사이에서만 변환이 가능하다, 소수는 못한다. 그리고 범위를 넘어가는 큰 수도 불가하다. 각종 알고리즘 문제들을 풀다 보면 종종 이들이 쓰일 때가 있는데, 이를 구현해 본다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | char* itoa(int val, char * buf, int radix) { char* p = buf; while (val) { if (radix <= 10) *p++ = (val % radix) + '0'; else { int t = val % radix; if (t <= 9) *p++ = t + '0'; else *p++ = t - 10 + 'a'; } val /= radix; } *p = '\0'; return buf; } | cs |
정수를 문자로 바꾸기한 itoa, val은 바꾸고 싶은 수, buf는 문자로 바꿔서 넣고 싶은 버퍼(char someting[??]이럴 것이다.), radix는 진법(10진법, 16진번 이런 것 )이다. 물론 기존 제공하는 함수와는 비교가 되지 않을 정도로 원시적이긴 하다.
1 | *p++ = (val % radix) + '0'; |
위 부분이 핵심이 된다. 문자로 바꾸어 주고 싶으면 '0'에 해당되는 ASCII코드 값을 더해 주면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | int atoi(char const *c) { int value = 0; int positive = 1; if (*c == '\0') return 0; if (*c == '-') positive = -1; while (*c) { if (*c >= '0' && *c <= '9') value = value * 10 + *c - '0'; c++; } return value * positive; } | cs |
문자열을 넣기만 하면 정수로 반환된 값을 return해준다. 부호를 고려하고 10진법이라고 가정한다.
타 블로그를 참고하였는데, 이분도 조금 혼란스러우셨던 것 같다. 내가 원하는 것을 문자"열"도 물론 좋지만 단일 "문자"로 바꾸는 것이었는데 그래서 조금 수정을 하였다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | char* itoa_c(int val, char * buf, int radix) { char* p = buf; if (radix <= 10) *p++ = (val % radix) + '0'; else { int t = val % radix; if (t <= 9) *p++ = t + '0'; else *p++ = t - 10 + 'a'; } return buf; } | cs |
1 2 3 4 5 6 7 8 9 | int atoi_c(char c) { int value = 0; if (c == '\0') return 0; if (c >= '0' && c <= '9') value = value * 10 + c - '0'; return value; } | cs |
'개발' 카테고리의 다른 글
C 언어 if-elseif-else문을 한 줄로! (0) | 2018.12.30 |
---|---|
C 언어 - linked list를 노드로 구현해 봤다. (0) | 2018.12.28 |
C - 구조체 배열을 함수에 사용할 때!! (2) | 2018.12.20 |
visual studio에서 파이썬 패키지 사용하기 (0) | 2018.12.10 |
ros에서 opencv 사용 및 webcam 사용하기 (1) | 2018.12.09 |