2014-04-29 5 views
3

while 루프에 문제가 있습니다. while 루프 이후의 문은 실행되지 않으며 이유는 알 수 없습니다. 나는 C++에 익숙하지 않고 이것을 이해할 수 없다. 나는 사용자로부터 입력으로 몇 가지 단어를 가져 와서 실습을 위해 문자열 벡터에 저장하려고합니다. 여기에 내 코드입니다 :while 루프 while 문을 실행하지 않은 문

#include "stdafx.h" 
#include <string> 
#include <iostream> 
#include <vector> 

using std::vector; 
using std::string; 
using std::cin; 
using std::cout; 
using std::endl; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    vector<string> list; 
    string word; 

    while(cin >> word) 
    { 
     list.push_back(word); 
     cout << "Added " << word << endl; 
    } 

    cout << endl; 
    cout << "Done" << endl; 

    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 

난이 콘솔 응용 프로그램을 실행할 때, 내가 루프가 실행되는 동안 내 진술과 메시지 "추가"하지만 "완료"메시지가 표시되지 않는 것을 볼 수 있습니다. 나는 while 루프 이후에도 다른 문을 지정하여이 문제를 시도했다. for 루프는 같은 문자열 벡터에서 & 표시 값을 가져 오는 루프와 같지만 루프가 실행 된 후에는 아무 명령문도 가져 오지 않는다. while 루프 이전과 while 루프 내에서만 명령문이 실행되며 이유는 알 수 없습니다.

+1

입력 스트림을 어떻게 종료 하시겠습니까? 그렇게하지 않으면 결코 루프를 종료하지 않습니다. 파일을 stdin으로 리디렉션하려고합니다 (예 : 'a.exe molbdnilo

+0

무한 루프라고 생각합니다. 입력 할 때마다 작동 할 것입니다. 루프를 어딘가에서 끊어야합니다. – Himanshu

+0

글쎄, 나는 사용자가 단어 입력을 중지하자마자 종료했다고 생각해. 이게 맘에 들지 않았 니? D : –

답변

1

cin이 항상 있다는 것을 의미 soemthing != 0를 반환하기 때문에 귀하의 while 루프가 종료되지 않습니다 당신은 무한 루프에 갇혀 있습니다.

string stop_string = "exit"; 

while(cin >> word) 
{ 
    if (stop_string.compare(word)) 
     break; 

    list.push_back(word); 
    cout << "Added " << word << endl;   
} 

또는 요아킴 Pilebord 같은 빈 줄을 감지 std::getline를 사용할 수 있습니다 제안 : 당신이 필요한 것은 휴식을 수행하는 루프 안에 다른 조건이다.

+0

나는 어떻게 그렇게 바보가 될 수 있습니다. 고맙습니다. :) –

+0

프로그래밍 언어에는 많은 이상한 개념이 있으며 초보자에게는 실수가 발생할 가능성이 높습니다. 그러나 이것이 우리가 모두 배우는 방법입니다. 그리고 우리 모두는 적어도 한 번 이상 그런 실수를했습니다. ;) – displayname

3

유효한 문자열을 입력하면 루프가 계속됩니다. 빈 줄을 입력하는 것만으로는 작동하지 않습니다. 입력 연산자는 공백이 아닌 문자를 읽을 때까지 그냥 차단됩니다. CTRL-Z (파일 끝 키보드 바로 가기)을 눌러 문자열을 실제로 "종료"해야합니다. 당신은 빈 줄을 감지하고 종료 조건을 위해 그것을 사용하려는 경우


, 당신은 std::getline를 사용해야합니다 :

std::string line; 
while (std::getline(std::cin, line) && !line.empty()) 
{ 
    ... 
} 
+0

리눅스에서 Ctrl + D가 아니라 Ctrl + Z라고 생각합니다. Ctrl + Z는 bakcground에 앱을 넣습니다. – fritzone

+0

Ctrl + Z는 Windows 용입니다. – Youda008

+0

@fritzone 예, Linux (OSX 및 BSD 및 기타 POSIX 시스템)에서는 전통적으로 CTRL-D이지만이 프로그램은 Windows 프로그램입니다 (' stdafx.h "헤더와'_tmain' 함수는'CTRL-Z'가 사용되는 Visual Studio)를 나타냅니다. –