본문 바로가기

개발

C 언어 문자를 숫자로 & 숫자를 문자로

 문자를 숫자로 바꾸어 주는 함수는 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;
    }
    *= '\0';
    return buf;
}
cs


 정수를 문자로 바꾸기한 itoa, val은 바꾸고 싶은 수, buf는 문자로 바꿔서 넣고 싶은 버퍼(char someting[??]이럴 것이다.), radix는 진법(10진법, 16진번 이런 것 )이다. 물론 기존 제공하는 함수와는 비교가 되지 않을 정도로 원시적이긴 하다.


1
*p++ = (val % radix) + '0';

cs



위 부분이 핵심이 된다. 문자로 바꾸어 주고 싶으면 '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 (*== '\0')
        return 0;
    if (*== '-')
        positive = -1;
    while (*c) {
        if (*>= '0' && *<= '9')
            value = value * 10 + *- '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