string을 int로 바꿀 수 없을까요? c_str로 raw pointer를 리턴받고, atoi에 raw_pointer를 넘겨주면 됩니다. 사실 저는 stoi를 알기 전까지 이렇게 했습니다.

 


 예제 프로그램을 보도록 하겠습니다.

 

 

 저는 string "123"을 정수 123으로 바꾸고 싶습니다. 그렇게 하려고 s.c_str()의 리턴값을 atoi에 넣었습니다.

 

 

 그러면, 실제 "123"을 들고 있는 위치인 p를 atoi에 넣게 됩니다. atoi는 이 위치부터 NULL이나, '0', ... '9'가 아닌 다른 것을 만날 때 까지 읽게 될 겁니다.

 

 

 문자열에 대충 이래 저장이 되어 있다고 하면, '1'을 읽고 '2'를 읽고 '3'을 읽고 난 후에 숫자가 아닌 문자가 있으니, break를 걸 겁니다.

 

 

 따라서, 이 때 atoi(s.c_str())의 값은 123이 됩니다.

 

 

 결과는 123이 나옵니다. 그런데 그리 깔끔하지 못한 방법 같습니다. 왜냐하면, c_str을 부르고, 또 다시 atoi를 부르기 때문입니다.

 

 


 string에는 stoi가 있는데요. string to int를 의미합니다. string을 int형으로 바꿀 때 많이 이용하는 메서드임을 알 수 있어요.

 

 

 사용법은 복잡하지 않으니, 예제만 보겠습니다. 7번째 줄에 stoi(s)를 넘겨 주었어요. s는 string "123"을 의미합니다. 이렇게 stoi에 string s를 넘겨주게 되면, s를 10진수 정수로 변환한 값을 돌려주게 됩니다. "123"을 10진수로 변환하면 123입니다. 따라서, 먼저 123이 출력되게 됩니다.

 

 다음에, stoi(s, nullptr, 4)가 있는데요. 여기서 중요한 것은 2번째 인자로 nullptr을 주었고, 3번째 인자로 4를 주었다는 것입니다. 4는 해당 string이 4진수로 표현된 것임을 의미하는데요.

 

 

 어떻게 계산될까요? 먼저 1의 자릿수에는 3이 있으니, 자릿수에 3을 곱한 값은 3이 됩니다.

 

 

다음에 4의 자릿수에 2가 있으니 자릿수에 2을 곱하면 8입니다.

 

 

 다음에 16의 자릿수에 1이 있나요? 16에 1을 곱하면 16입니다. 3과 8과 16을 더하면 11 + 16이니 27이 됩니다.

 

  

 따라서, 2번째로 출력되는 값은 27입니다. 어렵지 않네요. c_str과 atoi를 이용하는 거 보다는 stoi를 이용하는 것이 훨씬 깔끔하네요. 많이 이용해야 겠습니다.