본문 바로가기
Study

백준 1427 소트인사이드 / <cstdlib>_atoi()_문자형변환

by 187cm 2022. 1. 21.
반응형

이번 문제도 실버5로 매우 낮다.

따라서 이번에도 문제풀이 위주가 아닌 #include <cstlib> 의 atoi() 함수에 대해 알아보려고 한다.

크게 보자면 C++에서 문자형을 숫자형으로 바꾸기 위해서 어떻게 해야하는지 다시 적으려고 한다.

백준 소스코드는 맨 밑에 있다. 급하면 맨 밑으로

 

#문자열을 정수로 형변환

분명 티스토리에서 마크다운 모드가 아닌 기본모드에서 작성하는데 까먹고 #을 붙이게 된다. 아무튼 제목이다. 그렇다고 한다.

#include <cstlib> 혹은 <stdlib.h> 헤더파일에 atoi()함수가 존재한다.

 

atoi() 함수의 매개변수는 atoi(const char *)이다. 따라서 문자 하나를 정수형으로 바꾸면 오류가 난다. (char -> int)

stoi() 함수의 매개변수는 stoi(const string &__str) 이다. 

 

둘의 차이가 있다면 같은 문자열을 정수로 변환한다고 했을 때 다음과 같은 상황이 일어난다.

atoi를 사용하기 위해서는 str.c_str()을 붙여야 한다. 왜??? StackOverFlow를 보고 처음에는 귀찮게 이걸 왜 붙여야하나.. 이 생각을 엄청 했다. 하지만 atoi의 매개변수를 보고 이유를 깨닫게 되었다.

그 이유는 위에서 본 atoi()의 매개변수로 const char *를 받기 때문이다. str의 Type은 String 이기 때문에 오류가 뜨는것을 볼 수 있다.

#include <string>의 std::string c_str() 함수의 반환형은 char * 이기 때문에 String Type의 변수를 char * 형으로 반환해준다.

따라서 atoi(str.c_str()) 에는 오류가 뜨지 않고 atoi(str) 에는 오류가 뜨는 것을 확인 할 수 있다.

 

atoi(str.c_str()) 함수가 귀찮다면 stoi(str) 함수를 쓰자. 헤더는 똑같다. #include <cstdlib>  || #include <stdlib.h>

 

#문자를 정수로 변환

atoi(str[i])를 쓰고 왜 오류가 뜨지.. 하는 나는 멍청이.. atoi는 앞서 말했던 것 처럼 atoi(const char *) char *  타입을 넣어줘야 한다. 당연하게도 str[i]의 Type은 char * 이 아닌 char이니까 오류가 뜬다.

 

1학년 때 배운 아스키 코드 변환할 때 쓴 str[i] - '0' 을 사용해서 문자를 정수형으로 변환해주면 된다.

 

#문자를 실수 혹은 long 타입으로 변경

atof() == char * -> double Type 로 변경 == 문자열을 실수로

atol() == char * -> long Type으로 변경 == 문자열을 long Type으로 

 

#그래서 백준은 ..? 

반응형