2014-06-17 3 views
2

다음 코드를 고려하십시오 위의 코드를 실행예기치 이제 stringstream 동작

#include <sstream> 
#include <iostream> 

using namespace std; 

int main() 
{ 
    stringstream ss; 

    ss << string("12"); 
    int h; 
    ss >> h; 
    cout << h << endl; 

    ss.str(string("")); // clear the content of ss 

    ss << string("30"); 
    int m; 
    ss >> m; 
    cout << m << endl; 

    return 0; 
} 

것은 어떤 임의의 출력 산출 : 다른 시간에서

12 
0 

을, 다음과 같은 출력이 관찰된다 :

12 
4 

출력이 간단 할 것으로 예상했습니다.

12 
30 

예기치 않은 결과가 나타나는 이유는 무엇입니까?

또한 string s에서 int i까지 구문 분석하는 가장 좋은 방법은 C++ 11을 지원하지 않아야합니다. int i = atoi(s.c_str())일까요?

+0

_'Also, 구문 분석하는 가장 좋은 방법은 무엇이겠습니까 ... '_'std :: istringstream'을 사용하십시오. –

+0

스트림을 적절히 삭제하지 않으려면'ss.clear()'를 사용하십시오. – yizzlez

답변

6

스트림에서 12을 추출하면 끝까지 도달하므로 잘못된 상태가됩니다. 더 이상의 추출은 실패합니다. 내용을 삭제할 때쯤 ss.clear() 번으로 전화해야합니다.

추출 결과를 확인했다면이 문제를 피했을 것입니다. 나는 일반적으로 어떤 종류의 상태로 스트림에서 추출을 볼 것으로 기대합니다.

그리고 문자열 스트림을 사용하여 문자열을 정수로 구문 분석하는 것은 완벽하게 합리적인 방법으로 pre-C++ 11을 수행하는 것입니다. atoi을 사용하는 것이 좋습니다. C++ 11 방식을 알고 자하는 사람은 std::stoi을 사용하십시오.

+0

감사합니다! 'string s'를'int i'로 파싱하는 가장 좋은 방법은 무엇입니까? 'stringstream'은 좋은 아이디어입니까? – lwxted

+0

@lwxted 그래, 나는 그것을 'atoi'이상으로보고 싶다. –

+0

@lwxted'istringstream s ("123")를 사용하여; s >> value' 또는'ostringstream s; s << 값; s.str()'은 질문에서 문제를 피해야합니다 (stringstream을 피하십시오). –