안녕하세요. c언어 atoi 함수 는, char형 포인터를 받으면, int형을 (정수를) 리턴하는 함수입니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/ato_1.png)
이 함수는 stdlib.h에 있는 함수입니다.
- str
- 문자열. 즉 수로 바꿀 문자열
- 리턴 값 int
- 변환된 결과
예를 들자면 “34”라는 문자열을 c언어 atoi 함수 의 인자로 넘겨주면, 34가 리턴됩니다.
예제 프로그램
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/ato_4.png)
예제 1번을 보겠습니다. 먼저, 6번째 줄에서 문자열을 입력 받습니다. 다음에, atoi로 문자열을 수로 변환합니다. 다음에, 그 수에 1을 더해서, 출력합니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/ato_5.png)
실행 결과를 볼까요? 저는 44를 입력했습니다. 그랬더니, 어떻게 되었나요? “44”가 44로 변환되었습니다. 다음에, 이 결과에 1이 더해졌기 때문에, 45가 리턴됩니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/ato_2.png)
이제 예제 2번을 보겠습니다. 위 예제는 main 함수에 argc와 argv를 받는데요. 인자를 받는 프로그램입니다. argv[1]과 argv[2]가 있는데 인자 2개를 추가로 받습니다. 1번째 인자와 2번째 인자를 받아, 둘을 더하는 간단한 프로그램입니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/ato_3.png)
실행 결과는 어떻게 나올까요? 1번째 인자에 3, 2번째 인자에 5를 넣고 실행하니 8이 나옵니다.
atoll 함수
그런데 atoi 함수는 char pointer to int다 보니, 범위가 2^31보다 커져 버리는 경우, 제대로 동작하지 않을 수 있습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/ato_8.png)
다시 예제 2번 프로그램을 실행시켜 봅시다. 그러면, 0보다 큰 수 2개를 더했음에도 음수가 나옴을 알 수 있어요. 이 둘의 합은 40 0000 0000 0000 0000 보다 작습니다. 이 수는 2^31보다 큰 수입니다. 오버 플로우가 날 만도 하겠군요. 그런데, 저 두 수의 합은 2^31보다는 크지만, 2^63보다는 작습니다. 그러면 atoll을 쓰면 제대로 된 결과를 반환할 수 있지 않을까요?
char pointer to long long 함수, 즉 atoll 함수는 결과를 long long으로 변환해 줍니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/ato_9.png)
예제 3번을 봅시다. 아까와 다른 점은 1번 인자와 2번 인자를 atoi가 아닌 atoll로 변환했다는 점입니다. long long형은 -2^63부터 2^63 – 1까지는 담을 수 있습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/ato_10.png)
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보다 작으므로 오버플로우가 일어나지 않습니다.