Home » 레퍼런스 » C » c언어 atoi 함수 로 문자열을 숫자로 바꿔 봅시다.

c언어 atoi 함수 로 문자열을 숫자로 바꿔 봅시다.

안녕하세요. c언어 atoi 함수 는, char형 포인터를 받으면, int형을 (정수를) 리턴하는 함수입니다.


[그림 1] atoi 함수의 원형

이 함수는 stdlib.h에 있는 함수입니다.

  • str
    • 문자열. 즉 수로 바꿀 문자열
  • 리턴 값 int
    • 변환된 결과

예를 들자면 “34”라는 문자열을 c언어 atoi 함수 의 인자로 넘겨주면, 34가 리턴됩니다.


예제 프로그램

[그림 2] 예제 1번 프로그램

예제 1번을 보겠습니다. 먼저, 6번째 줄에서 문자열을 입력 받습니다. 다음에, atoi로 문자열을 수로 변환합니다. 다음에, 그 수에 1을 더해서, 출력합니다.

[그림 3] 1번 프로그램 실행 결과

실행 결과를 볼까요? 저는 44를 입력했습니다. 그랬더니, 어떻게 되었나요? “44”가 44로 변환되었습니다. 다음에, 이 결과에 1이 더해졌기 때문에, 45가 리턴됩니다.

[그림 4] 예제 2번 프로그램

이제 예제 2번을 보겠습니다. 위 예제는 main 함수에 argc와 argv를 받는데요. 인자를 받는 프로그램입니다. argv[1]과 argv[2]가 있는데 인자 2개를 추가로 받습니다. 1번째 인자와 2번째 인자를 받아, 둘을 더하는 간단한 프로그램입니다.

[그림 5] 예제 2번 프로그램의 결과

실행 결과는 어떻게 나올까요? 1번째 인자에 3, 2번째 인자에 5를 넣고 실행하니 8이 나옵니다.


atoll 함수

그런데 atoi 함수는 char pointer to int다 보니, 범위가 2^31보다 커져 버리는 경우, 제대로 동작하지 않을 수 있습니다.

[그림 6] 예제 2번의 오버플로우

다시 예제 2번 프로그램을 실행시켜 봅시다. 그러면, 0보다 큰 수 2개를 더했음에도 음수가 나옴을 알 수 있어요. 이 둘의 합은 40 0000 0000 0000 0000 보다 작습니다. 이 수는 2^31보다 큰 수입니다. 오버 플로우가 날 만도 하겠군요. 그런데, 저 두 수의 합은 2^31보다는 크지만, 2^63보다는 작습니다. 그러면 atoll을 쓰면 제대로 된 결과를 반환할 수 있지 않을까요?

char pointer to long long 함수, 즉 atoll 함수는 결과를 long long으로 변환해 줍니다.

[그림 6] 예제 3번 프로그램

예제 3번을 봅시다. 아까와 다른 점은 1번 인자와 2번 인자를 atoi가 아닌 atoll로 변환했다는 점입니다. long long형은 -2^63부터 2^63 – 1까지는 담을 수 있습니다.

[그림 7] 예제 3번 프로그램의 결과

2342 3489 0856과 32 9582 9068 0923 6236을 더한 값은 40 0000 0000 0000 0000 보다 작습니다. 예제 2번 프로그램을 실행 시켰을 때는 음수가 나왔는데, 이는 오버플로우 때문이였습니다. 하지만, 2^63 – 1까지 오버플로우가 안 나는 long long 형의 경우에는 이야기가 달라집니다.

40 0000 0000 0000 0000은 2^63보다 작으므로 오버플로우가 일어나지 않습니다.

Leave a Comment

20 + 13 =