2012-08-14 5 views
0

문자열을 입력하려고합니다. John과 같은 것을 입력하면 정상적으로 작동합니다.C++이 while do while while do 루프

하지만 John Smite과 같이 입력하면 끝이없는 루프와 터미널 충돌로 끝납니다.

string fullname; 

do{ 
    cout << "Please input the Full Name of the user: "; 
    cin >> fullname; 
}while(fullname==""); 
+0

가 for 루프는 "전체 이름은"무엇 – user1595932

+0

을 오타하지 말 것입니까? – PlasmaHH

+0

fullname은 문자열입니다 – user1595932

답변

1

공간이 낭비되고 있습니다. getline을 사용해야합니다.

+0

http://stackoverflow.com/a/2616977/62671 –

+2

아니요, 공간이 아닙니다. 직접 해보십시오. 주어진 코드 스 니펫 (적절한 포함 등을 가정)은 "John Smite"와 같은 입력에 대해 정상적으로 작동합니다 (여기서 "괜찮음"은 충돌하지 않으며 모든 단어를 fullname 변수에 넣지 않음). – PlasmaHH

+0

std :: cin이 공백을 토큰 화하기 때문에 "John Smite"가 "John"과 동일한 결과를 내야하지 않습니까? – Derek

1

당신이 시도 할 수이 하나 : 당신이 무한 루프 얻을 이유에

do{ 
cout << "Please input the Full Name of the user: "; 
cin >> fullname; 
} 
while(fullname.length() == 0); 
+0

사실 cin은 적절한 값이 입력 될 때까지 cin이 기다리기 때문에 while 루프가 필요하지 않습니다. 하지만 fullname이 sth special인지 확인하려면 while 루프를 사용할 수 있습니다. –

+0

@MihribanMNAZ : "적절한"의미에 따라 다릅니다. 적절한 경우, 비어 있지 않은 행을 의미하고, 아니오를 의미합니다. cin은 사용자가 엔터 키를 눌렀을 때 fullname을 비워 둡니다. OP는 비어 있지 않은 이름을 요구함으로써 OP가 막을 수 있다고 생각합니다. – PlasmaHH

+0

string :: length의 반환 값은'size_t' 타입이므로, 여러분의 조건은'(fullname.length() == 0)'으로 더 의미가 있습니다. – Derek

0

- operator>> 과부하 std::string에 대한 최초의 선행 공백을 삭제 한 후 다음 공백 또는 사용 가능한 입력의 한쪽 끝까지 읽어 .

"John Smite"를 입력하면 첫 번째 반복에는 "John"이 표시되고 두 번째 반복에는 "Smite"가 표시되고 이후의 반복에는 더 이상 입력이 없습니다. 문제는 읽기를 시도하기 전에 구현이 fullname을 지우는 것 같습니다. 하지만 스트림이 더 이상 양호한 상태가 아니기 때문에 더 이상 읽을 수 없으며 무한 루프가 있습니다.

당신이 대신 같은 뭔가를 할 수 :

string temp; 
string fullname; 
do { 
    cin.clear(); // clear any error flags 
    do { 
     if (cin >> temp) fullname += temp + ' '; 
    } while (cin.good()); 
} while (fullname.empty()); 

이것은 인접한 여러 공백 문자를 축소 A (좋은) 부작용이 있지만 여전히 꽤 투박합니다.

훨씬 더 좋은 방법은 죄송

do std::getline(std::cin, fullname); while (fullname.empty());