인프런 커뮤니티 질문&답변

Eunwoo님의 프로필 이미지
Eunwoo

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

1-I

1-I 문제 , 함수 질문

작성

·

221

·

수정됨

0

강의에서는 atoi(s.c_str()) 를 쓰는데

혹시 stoi 함수랑 개념이 같나요?

두 함수 모두 string 에서 int 형으로 변환하는데

어떤 차이가 있나요?

저는

 

for(int i=0;i<m;i++){

cin >> s;

if(atoi(s.c_str()) == 0) cout<<A[s] << "\n";

else cout << B[atoi(s.c_str())] << "\n";

}

 

이 부분을

 

for(int i=0;i<m;i++){
        cin >> s;
        if(isdigit(s[0])){
            cout << B[stoi(s)] << "\n";
        }
        else{
            cout << A[s] << "\n";
        }
    }

이렇게 해봤네요

답변 2

0

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 은우님 ㅎㅎ

혹시 stoi 함수랑 개념이 같나요?

두 함수 모두 string 에서 int 형으로 변환하는데

>> 네 하는 역할은 비슷합니다. string 또는 char* -> int에 대한 역할을 수행합니다. 즉, 둘 다 정수형 변환에 대한 역할을 수행합니다.

stoi()에 대한 자세한 설명은 다음과 같습니다.

stoi()

참고로 atoi()와 같은 기능을 하는 함수는 stoi()입니다. const char * 타입이 아닌 string 을 받아서 정수 int를 반환합니다. 

#include <bits/stdc++.h> 
using namespace std;
int main() {
   
string s = "1234";
   
int num = stoi(s);
   
cout << num; // 1234
   
return 0;

}


다만 문자열, string으로 입력을 받아 입력받은 글자가 문자열인지 숫자인지 확인해야 하는 로직이 필요할 때는 atoi()를 써야 합니다. stoi()를 하게 되었을 때 문자열이라면 다음과 같은 에러가 발생되게 됩니다. (에러 처리하는 로직을 넣는 것보다 0이 나와서 로직을 쓰는게 더 좋기 때문입니다.)

에러가 발생하는 코드

#include <bits/stdc++.h> 
using namespace std;
int main() {
   
string s = "aavv";
   
int num = stoi(s);
   
cout << num; // 1234
   
return 0;
}

 

참고로 해당 stoi에 대한 설명은 교안에 설명되어있습니다.



또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.


0

안녕하세요, 인프런 AI 인턴입니다.
Eunwoo님, atoistoi 함수 모두 문자열을 정수로 변환하는 기능을 하지만 몇 가지 차이가 있습니다.

  • atoi (ASCII to integer) 함수는 stdlib.h 헤더 파일에 선언되어 있으며, 문자열을 int로 변환합니다만, 예외 처리 기능이 없습니다. 즉, 변환 과정에서 문제가 생겨도 예외를 던지지 않고 오류를 알 수 없습니다.
  • stoi (string to integer) 함수는 C++11에 추가되었고 stringint로 변환하며, std::invalid_argumentstd::out_of_range 같은 예외를 처리할 수 있는 기능을 가지고 있습니다.
  • atoi 함수는 const char* 타입의 인자를 받기 때문에 std::string을 사용할 때는 c_str()을 호출하여 const char* 타입으로 변환해주어야 합니다. stoi 함수는 std::string 객체를 직접 인자로 받을 수 있습니다.

따라서, Eunwoo님께서 작성하신 코드에서 atoi(s.c_str()) 대신 stoi(s)를 사용하는 것이 더 현대적이고 예외 처리 면에서 안전한 방법입니다. isdigit(s[0])를 사용하여 문자열의 첫 번째 문자가 숫자인지 판단하고 분기하는 부분도 좋은 접근 방식입니다.

Eunwoo님의 프로필 이미지
Eunwoo

작성한 질문수

질문하기