문자열을 숫자로 바꾸어 주는 atof(), atoi()는 매우 편리한 함수입니다.

sscanf()는 포맷 형식에 따라 실수와 정수는 물론 8진수와 16진수 정수를 읽어 들일 수 있어서

더욱 편하죠. 그러나 편한만큼 주의하셔야 합니다.

예를 들어 아래와 같은 코드는 어떤 결과를 초래할까요?


int main( void)

{
    char    *ptr;

    printf( "%d\n", atoi( ptr));


    return 0;
}


ptr이 초기화되지 않았다는 컴파일 경고부터 보이지만, 실행할 수 있지요.

결론 세그멘테이션 오류가 발생합니다.


int main( void)

{
    char    *ptr = NULL;

    printf( "%d\n", atoi( ptr));


    return 0;
}


그렇다고 NULL로 초기화해도 역시 세그멘테이션 에러를 발생하죠. 


int main( void)

{
    char    *ptr = "";

    printf( "%d\n", atoi( ptr));


    return 0;
}


대신에 빈문자열이나 숫자가 아닌 "abcdefg" 문자열이면 0.0 으로 변환됩니다.

이는 sscanf() 함수도 마찬가지 입니다.


흠~ 누가 이런 바보 같은 짓을 하냐고요?


물론 같은 소스에 있다면 쉽게 잘못이 보입니다.

그러나 소스 파일을 달리해서 문자열 변수 ptr을 인수로 받는 함수로

분리하면 이와 같은 잘못을 저지를 수 있습니다.


또는 ptr 문자열을 어떤 함수를 통해 구한다면 역시 같은 문제를 발생할 수 있습니다.


ptr = get_float_str();     <<-- 이 친구가 초기화 되지 않는 포인터나 NULL을 반환할 수 있습니다.


그러므로 atof(), atoi(), sscanf() 함수를 사용하게 된다면

인수에 사용할 문자열 포인터는 최소한 NULL로 초기화하고

atof(), atoi(), sscanf() 함수를 사용하기 전에 NULL인지를 확인해야

프로그램이 중간에 종료되는 불상사를 막을 수 있습니다.