문자열을 숫자로 변환하는 함수
문자열을 숫자 자료형으로 변환하려면 어떤 방법으로 변환할 수 있을까요? 만약 입력이 숫자의 문자열이라고 가정한다면 아래의 코딩으로 숫자로 변환할 수 있습니다.
#include <stdio.h>
int my_atoi(const char* str) {
int ret = 0;
int i;
for (i = 0; str[i] != '\0'; i++) //NULL문자만나면 for문 종료
ret = ret * 10 + (str[i] - '0'); //숫자 문자에 '0'을 빼면 레알 숫자가 구해짐
return ret;
}
int main() {
int str = "12345";
printf("%d\n", my_atoi(str));
}
문자 하나에서 '0'을 빼면 이것이 곧 숫자 0이 된다는 점을 이용한 코드이지요. 사실 이렇게 간단하게 짤 수도 있겠지만 문자열에 숫자말고도 알파벳같은 글자가 섞여 들어오면 처리가 필요하게 됩니다. 코드짤때 에러 처리하는 것은 여간 귀찮은 것이 아니지요. 위 처럼 접근하는 것은 좋긴하지만 급할때 삽질하지 말라고 아래의 함수들을 C언어 라이브러리에서 제공해줍니다.
지금 소개해드릴 함수들이 그런 함수들입니다. 아래의 함수들을 사용하기 위해서는 stdlib.h 헤더파일을 우선 include시켜줘야한다는 점 기억하시구요.
atoi(Ascii To Integer) - int로 변환
#include <stdlib.h>
int atoi(const char* str);
atoi함수는 문자열을 정수형으로 변환시켜주는 함수입니다. 함수명의 앞글자 a는 Ascii를 의미합니다. 이후의 모든 함수의 a는 ascii의 a라는 점은 알아두시면 나중에 배운척 할 수 있습니다. 이 함수가 받는 str 문자열에서 숫자가 아닌 글자들은 모두 무시됩니다.
변환할 수 없는 값이라면 0을 반환합니다.
atol(Ascii To Long) - long으로 변환
atoll(Ascii To Long Long) - long long int로 변환
#include <stdlib.h>
long int atol(const char *str);
long long int atoll(const char *str);
long 형태로 입력을 받고 싶다면 atol 함수를 이용하면 됩니다. 이것도 모자라 long int의 범위를 넘어서는 큰 수를 입력받고 싶을때가 있습니다. 보다 큰 범위의 수를 변환하기를 원한다면 atoll 함수를 이용하여 변환할 수 있습니다.
반환할 수 없으면 0L을 반환합니다.
atof(Ascii To Float) - 부동소수점 값으로 변환
#include <stdlib.h>
double atof(const char *str);
정수형말고도 소숫점으로 변환할 수 있는 함수도 있습니다. atof라는 함수이지요. 전달받은 문자열을 부동 소수점 값으로 변환해주는 함수입니다. 여기서 float자료형을 반환하는 게 아닌 double 자료형으로 return 한다는 것을 유의하세요.
만약 함수를 통해서 반환할 수 없다면 반환값은 0이 됩니다.
단순한 설명보다는 무엇보다 어떻게 사용하는지 코드를 보면서 이해를 하는게 좋습니다.
아래의 코드는 기본적인 함수들의 사용법을 보여주는 예제입니다.
#include <stdio.h>
#include <stdlib.h>
int main() {
char* ll_str = "987654321123456789";
char* i_str = "1234";
char* f_str = "1234.567";
//long long 자료형 출력
printf("%lld\n", atoll(ll_str));
//정수형 10진수로 출력
printf("%d\n", atoi(i_str));
//부동 소수점으로 출력
printf("%.3f\n", atof(f_str));
i_str = "1234에 문자열 꼽사리";
printf("%d\n", atoi(i_str));
}
결과 화면
위 결과에서도 확인할 수 있듯이 "1234"에 다른 문자열 "에 문자열 꼽사리"를 섞어도 숫자만 추출해내는 것을 알 수 있습니다.
이처럼 C언어에서는 문자열을 숫자로 변환시켜주는 함수를 제공하니 알맞게, 필요할때 사용하시면 되겠습니다.
'언어 > C언어' 카테고리의 다른 글
[C/C++] 문자열 -> 16진수 String to Hex(Ascii to Hex) 소스 코드 구현 (0) | 2021.12.08 |
---|---|
[C언어] clock() 함수로 프로그램 수행 시간 구하는 코드 - 시간 측정 코드 (0) | 2021.05.30 |
[C언어] 출력 형식(format) 총정리 (Feat. sprintf, fprintf) - 일정한 간격으로 문자열 출력 예제 까지 (0) | 2021.04.15 |
[C언어] 메모리 관련 함수 설명 및 예제(memset, memcpy, memcmp, memchr) (0) | 2020.02.29 |
[C언어] 시간함수 time, localtime, ctime, asctime (6) | 2019.01.27 |