2014-10-03 4 views
0

이 사이트에는 getline이 작동하지 않는 질문이 몇 가지 있습니다. 버퍼에 지워야 할 개행 문자가 남아 있고, 약 cin.ignore()으로 추정됩니다. 나는 이것의 많은 변형을 시도했지만 아무 것도 작동하지 않는 것처럼 보입니다. 단순한 콘솔 입력이고 문자열에 공백이있을 수 있기 때문에 cin >> string은 옵션이 아닙니다.getline (cin, string) not working cin.ignore()

여기 내 코드입니다.

void prompt(std::string * str) 
{ 
    cout << "> "; 

    cin.sync(); 
    cin.get(); 
    cin.ignore(256, '\r'); 
    cin.ignore(256, '\n'); 
    cin.ignore(); 
    cin.ignore(); 

    std::string tmp; 
    getline(cin, tmp); 

    cin.sync(); 
    cin.get(); 
    cin.ignore(256, '\r'); 
    cin.ignore(256, '\n'); 

    *str = tmp; 
} 

나는 알 수 있듯이 모든 것을 시도했습니다. getline(cin,tmp) 위로 계속 건너 뛰고 str을 빈 문자열로 설정하는 것으로 보입니다. 도와주세요. 시간 내 주셔서 감사합니다.

+2

은 C 태그와 C++ 질문에 태그를하지 마십시오 –

+0

표준 : CIN> (모든'무시()'명령을 제거 시도하고 사용'표준 : :의 getline > std :: ws, tmp); 대신에. '>> std :: ws'는 모든 공백 (줄의 끝을 포함)을 건너 뜁니다. – Galik

+0

오류 검사가 표시되지 않습니다. 'if (! cin) {cout << "뭔가 failbit를 설정합니다." << endl; }' –

답변

0

포인터를 사용하여 변수를 전달하는 것은 바람직하지 않습니다. 함수 참조에서 값을 다시 얻으려면 &을 사용하는 것이 좋습니다.

prompt()을 호출하는 컨텍스트를 알지 못하지만 여기서는 prompt()을 구현하는 것이 좋습니다.

#include <algorithm> 
#include <iostream> 
#include <string> 

// return bool so you know if it failed or not 
bool prompt(std::string& s) // use reference 
{ 
    std::cout << "> "; 
    return std::getline(std::cin >> std::ws, s); 
} 

int main() 
{ 
    char c; 
    std::string s; 

    do 
    { 
     if(!prompt(s)) // always check the imput 
      break; 

     // process the string (reverse it for example...) 
     std::reverse(s.begin(), s.end()); 
     std::cout << "reversed: " << s << '\n'; 

     std::cout << "Another go? [y/n]: "; 
    } 
    while(std::cin.get(c) && std::tolower(c) == 'y'); 
} 
1

포맷 된 추출이 실패하면 스트림에 오류 비트가 설정되고 이후의 작업은 전혀 수행하지 않습니다. 이것은 매 작업마다 확인하는 것이 아니라 그룹 단위로 오류를 처리 할 수 ​​있기 때문에 다소 편리합니다. 그러나 일단 오류를 발견하면 다른 것을 시도하기 위해 오류 비트를 재설정해야합니다. 이 작업을 수행하는 명령은 아주 간단합니다 :

cin.reset(); 
+0

'getline' 호출이 실패 비트를 설정하는 것처럼 보입니다. – Jake

+1

@Jake :'getline' 바로 전에'if (cin) cout << "모든 것이 OK"<< endl; 그리고 getline 다음에'if (! cin) cout << "cin 실패"<< endl; 파일에서 입력을 리디렉션합니까? 'getline'은 입력 형식에 대해 까다롭지는 않습니다. 스트림 종료와 함께 실패 할 수있는 원인이 무엇인지 생각할 수 없습니다. –

+0

그래, 그 둘 다 인쇄, 그리고 난 당신이 무슨 뜻인지 모르겠지만 (의도적으로) 파일과 함께, 그냥 콘솔 입력을 정말로 읽으려고 노력하지 않을거야 : – Jake