이번 문제도 실버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으로
#그래서 백준은 ..?
'Study' 카테고리의 다른 글
유클리드 호제법 (최대공약수&최소공배수 구하기) (0) | 2022.01.23 |
---|---|
#include<algorithm>_ reverse / #include<cstdlib> itoa / #include<string> to_string (0) | 2022.01.23 |
#include <vector> / #include <cctype>_to(upper/lower), is(upper/lower) (0) | 2022.01.22 |
백준 2822 점수계산 (실버 5) / <algorithm>_sort() (0) | 2022.01.20 |
이진 탐색(정렬) & #include <cmath>_pow() (0) | 2022.01.12 |