2014-04-17 3 views
2

사용자의 입력을 특정 방식으로 얻는 프로그램을 작성하려고합니다. 먼저 공백이없는 단어를 입력합니다. 그런 다음 공간을 포함 할 수있는 다른 단어를 입력합니다. 그리고 프로그램은 2 워드를 별도로 출력합니다. 예를 들어C++ Cin 뒤의 Getline

, 내가 입력 "톰 게으른 소년"그럼 프로그램 출력 "톰 : 게으른 소년"

int main(){ 
    string a; 
    cin >> a; 
    string b; 
    getline(cin, b); 
    cout << a << ":" << b<< endl; 
} 

내가의 getline을 사용하여 시도 여기

내가 할 시도한 것입니다 "Tom : 게으른 소년"

"Tom (많은 공간)에 게으른 소년"을 입력하면 "Tom : (많은 공간) 게으른 소년" 과 I가 출력됩니다. 그 공간을 원하지 마라. 이 작업을 수행하는 더 좋은 방법이 있습니까?

cin 뒤에 문자열을 편집해야하는 몇 가지 방법이 있지만 입력 단계에서 바로 문제를 해결할 수 있습니까?

+1

'std :: cin >> std :: ws;'는 스트림에서 선행 공백을 제거합니다. – dyp

+0

@dyp 당신은 최고의 답을 가지고 있습니다. 그렇게 게시해야합니다. – ooga

+0

@dyp 동의하며, 간단하고 잘 작동합니다. 고맙습니다. – user3545752

답변

0

그래서 프로그램에 넣은 공간을 잡는 것만 큼 여러 가지 방법으로 제거 할 수 있습니다!

  1. 당신은 문자로 cin.get() 문자를 사용하여 입력 자신을 스트리밍 할 수 있습니다 당신이 공간을 얻을 때까지 계속 문자열로 추가하지만 '외설 뭔가를 얻을 때까지 공간을 추가하지 마십시오 공간을 얻은 다음 getline을 사용하거나 이번에는 사용자 정의 스트리밍을 계속할 수 있습니다.

  2. 여분의 공백을 쉽게 제거하기 위해 결과 문자열을 편집 할 수 있습니다. substr() 메서드를 살펴보십시오! 당신이 무시하려는 경우

1

getline()는, 공백을 읽고 선두 공백 시도 :

cin.ignore(); 
getline(cin, b); 

편집 :

getline(cin, b); 
    string noLeadingWS = b.substr(b.find_first_not_of(' '),b.length()-b.find_first_not_of(' ')); 
    cout << a << ": " << noLeadingWS<< std::endl; 
: 죄송합니다, 실제로 1 개 문자를 읽고,이 당신을 위해 다른 솔루션입니다
+1

그래도 하나의 문자 만 무시하므로 공백이 여러 개인 경우 도움이되지 않습니다. –

+0

전혀 작동하지 않습니다. 'cin.ignore()'는 하나의 공백을 제거합니다. – ooga

+0

죄송 합니다만 한 공간 만 제거하는 것 같습니다. 아직도 고마워. – user3545752

1

std::getline 함수는 일반 입력 연산자 >>처럼 공백을 건너 뛰지 않습니다. 공백 문자를 제거해야합니다.

첫 공백 문자를 제거하려면 먼저 공백이 아닌 첫 번째 문자 (예 : std::find_if)를 찾아 그 위치에서 나머지 부분까지 하위 문자열 (std::string::substr)을 가져옵니다.


또는 dyp가 제시하는대로 std::ws을 사용하십시오. 링크 된 참조는 그것을 사용하는 아주 좋은 예가 있습니다.

+1

std :: ws는 ​​어떻게됩니까? – dyp

+0

@dyp 그것은 항상 잊어 버릴 정도로 알려지지 않았습니다. 이를 답변으로 추가해야합니다. –

+0

이 질문은 아마도 어쨌든 중복됩니다. 당신이 원한다면 당신의 대답에 그것을 추가하십시오. – dyp

관련 문제