728x90

정수를 입력받는 함수


문제점

scanf 함수를 사용해서 정수형 수를 입력받을 경우, 문자를 입력하거나 범위보다 큰 값을 입력했을 때 정수 오버플로우가 일어납니다.

scanf의 리턴형을 확인하는 방법으로 문자를 입력할 때 프로그램에 문제가 생기는 것을 막을 수는 있지만, 정수 오버플로우의 문제는 여전히 남아있습니다.


해결방법

위와 같은 문제를 해결하기 위해 먼저 문자열로 수를 입력받은 다음, 그 값을 숫자로 변환시키면 어떨까 생각하게 되었고, 그것을 코드로 작성해보았습니다.


정수를 입력받는 함수

#include <stdio.h>

void intInput(char str[], int *num) {
    do {
        fgets(str, sizeof(str), stdin);
    } while(sscanf(str, "%d", num) != 1);
}

int main (void) {
    char str[4];
    int num = 0;

    printf("숫자를 입력해주세요 : ");
    intInput(str, &num);      

    printf("입력받은 수 : %d \n", num);
    return 0;
}


실행결과

숫자를 입력해주세요 : 123
입력받은 수 : 123

숫자를 입력해주세요 : 12345
입력받은 수 : 123

숫자를 입력해주세요 : -12345
입력받은 수 : -12

먼저, 위의 함수는 문자 배열과 정수의 주솟값을 매개변수로 전달받으며, 전달받은 문자 배열에 fgets 함수를 이용해서 문자를 입력받습니다.

입력받은 문자를 sscanf 함수를 이용해서 포인터로 전달받은 정수변수에 넘겨주는데, sscanf 함수의 리턴값을 확인해서 1이 아닌 경우(정상적으로 문자를 변환할 수 없는 경우)에는 반복문을 다시 한번 돌립니다.


위와 같은 방법으로 문자를 입력받았을 때와 범위에 벗어나는 수를 입력받았을 때 일어나는 예측할 수 없는 버그들을 피할 수 있습니다.

728x90
728x90

'Project > C Project' 카테고리의 다른 글

[C Project] 카카오톡 광고 제거 프로그램 제작  (1) 2016.12.20