티스토리 뷰
atoi
정수 문자열을 정수형 데이터로 형변환
atoi 함수는 정수형 문자열을 정수형 데이터로 전환해준다.
atoi 함수는 입력 받은 문자의 앞의 공백을 모두 건너뛰고 첫 문자를 찾아낸다.
그 다음, 음수와 양수 표기가 있는지 확인하고 그 뒤에 나오는 숫자 문자를 읽어 아스키 코드 연산을 통해 숫자를 반환한다.
- 문자 입력
- 문자 전반부의 공백 건너뜀
- 첫 문자 표기법 확인 (음수, 양수 확인)
- 문자를 읽으며 숫자로 전환
- 문자가 끝나거나 전환할 문자가 숫자가 아닌 경우 작업 종료
- 정수 반환
헤더 | C | stdlib.h |
C++ | cstdlib | |
함수명 | atoi | int atoi (const char * str); |
매개변수 |
const char * str | 형변환을 진행할 문자열 |
반환값 | int | 형변환이 완료된 정수 |
예제코드
#include <stdio.h>
#include <string.h>
#define LIMIT 10
#define START_OF_SPACE_ASCII 9
#define END_OF_SPACE_ASCII 13
#define SPACE_ASCII 32
int fn_atoi(char* input);
int main(void) {
while (1) {
char letters[11];
printf("Enter integer (Max 10) : ");
if (scanf("%s", letters) == EOF || strcmp(letters, "exit") == 0) break;
if (strlen(letters) > LIMIT) {
printf("Out of max digit.\n");
continue;
}
printf("Output : %d\n", fn_atoi(letters));
}
return 0;
}
int fn_atoi(char* input) {
int iterator = 0;
int result = 0;
int positive = 1;
while ((input[iterator] >= START_OF_SPACE_ASCII && input[iterator] <= END_OF_SPACE_ASCII) ||
input[iterator] == SPACE_ASCII ||
input[iterator] == '+') {
iterator++;
}
if (input[iterator] == '-') {
iterator++;
positive = -1;
}
while (input[iterator] >= '0' && input[iterator] <= '9') {
result *= 10;
result += (input[iterator] - '0');
iterator++;
}
result *= positive;
return result;
}
이번 작성 중 문제될 것은 크게 없었다.
입력 받을 때는 줄바꿈, 문장 끝 그리고 EOF에 대한 예외처리를 다 해주면 좋다.
다만 공백 제거에서 <cctype> 라이브러리에 isspace함수가 존재하기에 이를 사용하면 나처럼 일일이 공백 범위를 지정해 주지 않아도 된다.
또한, 실수할 수 있는 부분이라고 한다면, 숫자를 변환하는 계산에서 자릿수 계산을 잘해주어야 한다는 것이다.
우리는 문자를 앞에서 부터 읽기 때문에 가장 큰 수가 가장 먼저 읽히는 것이다.
즉, 다음 숫자를 읽을 수록 앞의 숫자가 10의 단위로 커져야하는 것이다.
이 외에는 딱히 주의할 것은 없을 것 같다.
문자 관련 문제라 아스키 코드 참고를 많이 한 것 같다.
참고자료
'Computer Language > C & C++' 카테고리의 다른 글
[C/C++] Memset (0) | 2023.11.05 |
---|---|
[C/C++] EOF (0) | 2023.11.05 |
[c] 전화번호부 만들어보기 (0) | 2023.10.30 |
[c] strcpy 함수 구현 (1) | 2023.10.24 |
[C++] C++와 C#의 차이 (1) | 2023.09.24 |