2017-09-07 10 views
0

은이 같은 콘솔에서 입력을 판독하려고하면왜 cout이 작동하지 않습니까?

6 6 4 
1 1 1 
2 1 1 
1 2 1 
2 2 1 

다음 코드 조각, 트리플렛의 라인마다, I 간단 찾는를 계산하는 (N/A + 1) * (m/A + 1) 결과를 콘솔에 출력합니다.

while(cin.get()!='\n'){ 
    int n=0, m = 0, a =0; 
    cin >> n >> m >> a; 

    cout <<(n/a+1) * (m/a+1) << endl; 

} 

그러나 작동하지 않는 이유는 무엇입니까? 여기

+3

당신은'cin.get()'이 입력 버퍼로부터 문자를 추출 할 것이라는 것을 알고 있습니다. 그 성품은 영원히 사라질 것입니다. 한 번에 한 줄씩 읽으려면 ['std :: getline'] (http://en.cppreference.com/w/cpp/string/basic_string/getline)과 ['std :: istringstream' ] (http://en.cppreference.com/w/cpp/io/basic_istringstream)을 참조하십시오. –

+3

스택 오버플로에 오신 것을 환영합니다. "작동하지 않습니다."무슨 일이 일어날 지 알려주시겠습니까? – philant

+0

shin 나는 당신의 질문에 대답했다, 당신은 그것을 보았 느냐? – gsamaras

답변

7

는 :

while(cin.get()!='\n') 

당신은 표준 입력에서 문자, 루프의 조건이 평가 때마다 압축을 풉니 다.

결과적으로이 세 문자를 구문 분석하려고하면 해당 문자가 이미 소비됩니다.


사용 std::getline() 라인으로 입력 라인을 구문 분석하고, 각 라인에서, 삼중를 얻을 수 있습니다.

예 :

#include <sstream> 
#include <string> 
#include <iostream> 

int main() { 
    std::string line; 
    while (std::getline(std::cin, line)) 
    { 
     std::istringstream iss(line); 
     int n, m, a; 
     if (!(iss >> n >> m >> a)) { break; } // error 
     std::cout <<(n/a+1) * (m/a+1) << std::endl; 
    } 
    return 0; 
} 

출력 :

4 
4 
6 
6 
9 

PS : FYI (n/a+1) * (m/a+1)오버플n IF 및 m이다 100,000 a 한 자리 수가된다. 형식을 long int의 시드 m, n, a에 입력하면이 const_cast<long int>((n/a+1) * (m/a+1))처럼 정수가됩니다.