728x90

특정 문자열이 숫자인지 확인하고 싶은 경우가 있다.

그리고 만약 그 문자열이 숫자가 맞다면 숫자로 변환하고 싶은 경우가 추가적으로 존재한다고 가정해보자.

다른언어에서는 친절하게 함수들이 있는 경우가 많다.


놀랍게도 cpp은 없다!!

왜 없냐고?? 몰라나도...


isdigit이라는 함수가 존재한다. cctype(ctype.h)를 import해주면 쓸 수 있다.

그런데 문제는 이 함수는 특정 '문자'의 숫자 판별만 할 뿐이다.

문자열을 판별하려면?? 별수있나 순회하는 수 밖에....


하지만 훨씬더 간단한 방법으로 해당 문자열이 문자인지 판단할 수 있는 방법이 있다.

이 역시 하나의 함수다! 심지어 c시절 부터 존재하던 함수이다.


바로... atoi이다!!


int  atoi(const char *);

c언어 시절부터 존재하던 함수로 iostream을 include해주면 사용할 수 있다.

c언어 시절에는 stdlib.h에 들어가 있었는데 cpp에서 stdlib.h가 iostream에 포함되서 그렇다.


이 함수의 본디 역활은 cstyle string을 숫자로 바꿔주던 함수였다.

근데 이걸로 숫자인지 판별 가능하냐고??


atoi는 해당하는 문자열이 숫자면 숫자를 반환한다 만약 해당하는 숫자가 숫자가 아니라면 0을 반환한다.

예시를 보자.


#include <iostream>

using namespace std;

int main() {
string s1 = "대한민국";
string s2 = "-123";
string s3 = "456";
string s4 = "0";

cout << atoi(s1.c_str()) << endl;
cout << atoi(s2.c_str()) << endl;
cout << atoi(s3.c_str()) << endl;
cout << atoi(s4.c_str()) << endl;
}

위와같은 코드가 있다면 atoi를 사용하면 된다.

그러면 만약 숫자라면 숫자로 변환되고 문자라면 0이 반환된다.


근데 한가지 문제점이 있다.

0을 문자열로 쓰면 어짜피 숫자 0이 반환되므로 둘의 차이를 알 수 없다는 점이다.

그래서 보통 숫자인지 여부를 알고 싶다면 한가지 더 장치를 한다.


#include <iostream>

using namespace std;

int main() {
string s1 = "대한민국";
string s2 = "-123";
string s3 = "456";
string s4 = "0";

cout << (atoi(s1.c_str()) != 0 || s1.compare("0") == 0) << endl;
cout << (atoi(s2.c_str()) != 0 || s2.compare("0") == 0) << endl;
cout << (atoi(s3.c_str()) != 0 || s3.compare("0") == 0) << endl;
cout << (atoi(s4.c_str()) != 0 || s4.compare("0") == 0) << endl;
}

atoi가 0이 아닌지 확인하고 문자열로서 0인지 확인한다.

둘중 하나라도 참이면 숫자인 것이다.

이렇게 매번 확인하기 귀찮으니 함수로 제작할 수 있다.


#include <iostream>

using namespace std;

bool is_digit(string str) {
return atoi(str.c_str()) != 0 || str.compare("0") == 0;
}

int main() {
string s1 = "대한민국";
string s2 = "-123";
string s3 = "456";
string s4 = "0";
cout << is_digit(s1) << endl;
cout << is_digit(s2) << endl;
cout << is_digit(s3) << endl;
cout << is_digit(s4) << endl;

}

cpp에서 레거시 함수들을 건드리지 않으려다보니까 이상한 작업을 해야하는 경우가 많다.

조심을 요한다.

+ Recent posts