2012-01-14 2 views
3

everyone. 나는 C++에 적응하려고 노력하는 경험 많은 C 프로그래머이다. 나는 ...이 C 문에 해당 할C++에서 문자열 내의 문자열 검색

sscanf(str, "%s %s", sub1, sub2); 

을 좋아 ...하지만 C++의 문자열 객체 것이다. str이 "hello world"라고 말하면 위의 sscanf 문을 사용하면 sub1에 "hello"를 입력하고 sub2에는 "world"를 넣습니다. C++에서 C 함수를 사용할 수 있다는 것을 알고 있지만 char 배열 대신 C++ 문자열 객체를 사용하고 싶습니다.

string q, h, w; 
cout << "Type \"hello world\": "; 
cin >> q; 
istringstream x(q); 
x >> h >> w; 
if (h == "hello") 
    cout << "Yes!\n"; 
else 
    cout << "No!\n"; 
if (w == "world") 
    cout << "Yes!\n"; 
else 
    cout << "No!\n"; 

를하지만 출력 "아니오!", 의미는 "안녕하세요"가 아니라 "세계"를 집어 :이 시도했습니다. 어떤 아이디어?

답변

3

cin과 함께 사용되는 operator>>은 "hello"구문 만 캡처하고 첫 번째 구분 기호 (이 경우에는 공백)에서 멈추기 때문입니다. 사용자가 입력 한 첫 번째 줄 구분 기호까지 전체 입력 줄을 캡처하려면 getline(cin, q)을 사용해야합니다. getline()의 두 인수 버전은 구분 기호로 줄 바꿈을 사용하지만 사용자 정의 줄 구분 문자도 지정할 수있는 3 개의 인수 버전이 있습니다.

+2

그리고 스트림 작업을 오류 검사했다면 이미 거기에서 잡았을 것입니다! –

3

오류 검사없이 iostream을 사용하지 마십시오. 제이슨이 말한대로, 전체 라인이 아니라 하나의 토큰을 읽을 수 있지만 그렇다하더라도 오류를 확인합니까 : 당신이 독서를 유지하려는 경우

std::string line; 

if (std::getline(std::cin, line)) 
{ 
    std::string h, w; 
    std::istringstream iss(line); 

    if (iss >> h >> w) 
    { 
     // success 
    } 
    else 
    { 
     std::cerr << "Error reading your input.\n"; 
    } 
} 
else 
{ 
    std::cerr << "Error reading from stdin!\n"; 
} 

당신은 루프에 if들 수 있습니다.

기본적으로, 결과는 테스트 할 무언가로 변환하기 때문에 당신이 조건으로 모든 형식의 추출 (getline, >>)를 확인 할 수 있으며, 작업이 실패 할 경우 조건이 false 될 것입니다. 따라서 조작이 성공하지 않으면 의도 한 수신자 변수를 해석해서는 안됩니다!

x >> h >> w; 코드에이 체크를 추가했다면 절대로 그 라인을 넘지 않았을 것입니다.