2014-06-09 1 views
0

std :: string str = "1001 0104 2325 9999"형식의 문자열이 있고이 4 개의 부분 문자열을 공백으로 정수로 저장해야합니다. C (sscanf 사용)에 문자열이있는 것처럼이 작업을 수행하는 우아한 방법이 있습니까? 이것은 숙제 문제가 아닙니다.std :: string에 대한 sscanf와 같습니다.

+1

['std :: stringstream' ] (http://en.cppreference.com/w/cpp/io/basic_stringstream). –

+0

@BaummitAugen'std :: istringstream'가 더 적절할 것입니다. –

+0

@JamesKanze 힌트를 보내 주셔서 감사합니다. –

답변

1

가장 깨끗한 방법은 아마 istream_iterator와 이제 stringstream을 사용하는 것, 이런 식으로 뭔가 : 사용자가 제공 한 입력의 모호성 약간의가 있음을

std::string str = "1001 0104 2325 9999"; 

std::istringstream in(str); 

std::vector<int> numbers { 
    std::istream_iterator<int>(in), 
    std::istream_iterator<int>() 
}; 

// just to show what we did: 
for (int i : numbers) 
    std::cout << i << "\n"; 

참고 : 그것은 의도 당신이 있는지 분명하지 않다 0104은 10 진수 또는 8 진수 여야합니다 (앞에 오는 0으로 인해 소스 코드로 해석 될 수 있습니다). 위에서 작성한 코드는 십진수로 해석합니다. 0을 8 진수로 나타내려면 (변환이 0 일 때 최소한 0x을 나타냄) 변환의 기준을 0으로 설정하여 수행 할 수 있습니다.

+2

선행'0'을 8 진수로 처리하려면'basefield'를'0'으로 설정하십시오. 'in.setf (std :: ios_base :: fmtflags(), std :: ios_base :: basefield)'를 호출한다. 왜냐하면 거기에 지정된 플래그 나 조작자가 없기 때문이다. 이것이 최선의 해결책인지 여부에 관해서는 그가 가변적 인 수의 필드가 있는지 여부에 달려 있습니다. 매번 정확하게 4 개의 정수가 필요하다면'in >> i1 >> i2 >> i3 >> i4'가 더 좋으며 더 이상 필드가 없는지 확인하는 오류 검사가 있습니다. –

관련 문제