티스토리 뷰

atoi

정수 문자열을 정수형 데이터로 형변환

 

 

atoi 함수는 정수형 문자열을 정수형 데이터로 전환해준다.

 

atoi 함수는 입력 받은 문자의 앞의 공백을 모두 건너뛰고 첫 문자를 찾아낸다.

그 다음, 음수와 양수 표기가 있는지 확인하고 그 뒤에 나오는 숫자 문자를 읽어 아스키 코드 연산을 통해 숫자를 반환한다.

 

  1. 문자 입력
  2. 문자 전반부의 공백 건너뜀
  3. 첫 문자 표기법 확인 (음수, 양수 확인)
  4. 문자를 읽으며 숫자로 전환
  5. 문자가 끝나거나 전환할 문자가 숫자가 아닌 경우 작업 종료
  6. 정수 반환

 

헤더 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
최근에 올라온 글
최근에 달린 댓글
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함