2014-10-09 3 views
3

사용자로부터 여러 줄을 하나의 줄로 가져 와서 벡터에 저장하고 싶습니다. 이것은 내가 그 일을하고 어떻게 :cin을 한 번만 사용하려면 어떻게해야합니까?

vector<int> numbers; 
int x; 
while (cin >> x) 
    numbers.push_back(x); 

을하지만, 내 번호를 입력 한 후 키를 눌러과 같이 입력하십시오

1 2 3 4 5 

그것은 벡터의 수를두고 한 다음 의미 이상의 입력을 기다립니다 루프를 종료하려면 Ctrl+Z을 입력해야합니다. 한 줄의 정수를 얻은 후에 루프를 자동으로 종료하므로, Ctrl+Z을 입력 할 필요가 없습니다.

+0

각 숫자 다음에 Enter를 누르십니까? 아니면 한 줄일까요? –

+0

@ MichałWalenciak 한 줄입니다 – Shadow

+1

'string'에 입력 행 ('getline')을 읽고 문자열 스트림을 사용하여 문자열에서 숫자로 데이터를 변환합니다. –

답변

9

이 문자열 스트림을 사용하는 것입니다 달성하는 가장 간단한 방법 : 당신이 할 수있는 루프 후

#include <sstream> 
//.... 

std::string str; 
std::getline(std::cin, str); // Get entire line as string 
std::istringstream ss(str); 

while (ss >> x) // Now grab the integers 
    numbers.push_back(x); 

입력의 유효성을 검사를 :

if(!ss.eof()) 
{ 
    // Invalid Input, throw exception, etc 
} 
+0

'std :: istringstream'보다는 왜'std :: stringstream'인가? (나는'std :: stringstream'을 사용한 적이 기억이 없다.) –

+0

또한 포맷을 검증 할 무언가를했습니다. 그대로라면, 행에''1 2 x 4 ''가 있으면 코드는 1과 2를 구문 분석 한 다음 오류를 표시하지 않고 중지합니다. ('ss.eof()'가 true인지를 확인하십시오.) 루프가 충분할 것입니다.) –

+0

@JamesKanze 1)'std :: istringstream'을 사용했는데, 아마도 맹목적으로 입출력 작업 모두에'std :: stringstream'을 사용할 것입니다 'std :: fstream'과 유사합니다. 2) 수표를 추가했습니다. – P0W

0
while (std::cin.peek() != '\n') { 
    std::cin >> x; 
    numbers.push_back(x); 
} 

갱신

while (std::cin.peek() != '\n') { 
    std::cin >> x; 
    numbers.push_back(x); 

    // workaround for problem from comment 
    int tmp; 
    while (!isdigit(tmp = std::cin.peek()) && tmp != '\n') { 
     std::cin.get(); 
    } 
} 
+1

이것은 POW의 해결책과 마찬가지로 작동하지 않습니다 - 마지막 숫자 이후와 줄 바꿈 이전의 공백/탭은'std :: cin >> x' 변환이 실패하면 반복문에 멈추게됩니다 (예 : 일부 텍스트 줄에). –

+0

@flaggers : 플래그는 코드 문제의 정확성을 위해 사용되지 않습니다. – ChiefTwoPencils

+0

@TonyD 네, 맞아요. 나는 그것을 해결하기 위해 내 대답을 업데이 트했습니다. – Kastaneda

관련 문제