2008-10-14 9 views
45

Possible Duplicate:
How to parse a string to an int in C++?어떻게 C++ 문자열을 int로 변환합니까?

어떻게 C++ 문자열을 int로 변환합니까?

문자열에 실제 숫자 ("1", "345", "38944"등)가 있어야한다고 가정하십시오.

또한 부스트가없는 것으로 가정하고, 실제로 C++ 방식으로하고 싶다고 가정 해 봅시다.

+13

다음은 몇 가지 예입니다. http://www.codeproject.com/KB/recipes/Tokenizer.aspx 매우 효율적이고 다소 우아합니다. –

답변

33

C++ 스트림을 사용하십시오.

std::string  plop("123"); 
std::stringstream str(plop); 
int x; 

str >> x; 

/* Lets not forget to error checking */ 
if (!str) 
{ 
    // The conversion failed. 
    // Need to do something here. 
    // Maybe throw an exception 
} 

ps. 이 기본 원칙은 부스트 ​​라이브러리 lexical_cast<>의 작동 방식입니다.

내가 가장 좋아하는 방법은 부스트 ​​lexical_cast<>

#include <boost/lexical_cast.hpp> 

int x = boost::lexical_cast<int>("123"); 

그것은 다시 문자열 및 숫자 형식 사이에 변환 할 수있는 방법을 제공합니다. 아래에는 문자열 스트림을 사용하므로 스트림에 마샬링 된 다음 스트림에서 언 마샬링 될 수있는 모든 것 (>> 및 < < 연산자 참조).

+0

은 "if (! x) ..."가 아니어야합니까? – Svante

+4

아니요. 스트림 연산자가 str에서 숫자를 추출하지 못하면 잘못된 비트를 설정합니다. 부울 컨텍스트 (위와 같이)에서 이것을 사용하면 bool로 변환 할 수있는 객체를 반환하여 스트림이 정상인지 테스트합니다. 'x'를 테스트하면 'x'에 넣은 값이 0이면 실패합니다. 스트림에서 아무 것도 추출하지 못하면 'x'값이 정의되지 않습니다. –

+1

_bad_ 비트가 아닌 _fail_ 비트를 설정합니다. 운영자! fail()의 동의어입니다. – scai

0

이 기능은 당신에게 결과를 알려줍니다

StrToInt 

"stdapi.h"얼마나 많은 문자를 사용 atoi

+0

특히 C++이 아닙니까? std :: atoi는 실제로 C++가 아닙니다. –

+2

atoi()는 다른 공백을 무시하고 공백이 아닌 공백을 무시하고 "0"이 유효한 오류 조건이라고 가정합니다. 정말로 타당성에 대해 신경 쓰지 않는 경우에만 atoi()를 사용하십시오. 그렇지 않으면 C에서 strtod()를, C++에서는 std :: istringstream을 사용합니다. –

72
#include <sstream> 

// st is input string 
int result; 
stringstream(st) >> result; 
+3

오류가 있으면 어떻게됩니까? 문자열에 숫자가 없다고 가정 해보십시오 ("5"대신 "hello!"). – krupan

+20

그런 다음 오류를 확인하십시오 : (stringstream (st) >> result)? cout << 결과 : cerr << "잃어버린다"; –

-6

는 변환에 참가했다. 정확히 당신이 atoi 함수를 사용하지 이유가 내가 질문을 오해하고 아마도

#include <sstream> 
int main() 
{ 
    char* str = "1234"; 
    std::stringstream s_str(str); 
    int i; 
    s_str >> i; 
} 
+2

응? 이 "stdapi.h"로 검색하면 아무 것도 나타나지 않습니다. "shlwapi.h"(Windows 전용, 쉘 DLL의 일부이며 오래된 C 방법과 동일 함)를 의미합니까? – bk1e

4

내가 전에 다음과 같은 C++에서 코드 같은 것을 사용했다? 바퀴를 재발 명할 필요가 없습니다.

여기에 요점이 누락 되었습니까?

+1

확인. 누군가 이미 이것을 제안 했으므로 나는 그것들을 올렸습니다. – ayaz

0

:

+0

atoi()의 매뉴얼 페이지에 "atoi() 함수는 strtol()에 포함되어 있지만 기존 코드에서 광범위하게 사용되기 때문에 유지됩니다. 범위 내에 있지 않으면 strtol atoi()가 오류 검사를 수행 할 필요가 없기 때문에 사용됩니다. " – krupan

+0

atoi()는 비표준이므로 어디서나 사용할 수 없습니다. 그래도 틀릴 수 있습니다. –

+0

그건 훌륭한 지적입니다, Krupan. 나는 그 생각을하지 못했다는 것을 인정한다. – user12576

2

나를 오류에

#include <boost/lexical_cast.hpp> 

int val = boost::lexical_cast<int>(strval) ; 

그것은 발생 bad_lexical_cast lexical_cast 부스트 :: 내 투표를 추가 할 수 있습니다.