2014-10-08 4 views
0

getline (cin, variablehere) 함수를 사용할 때 프로그램에서 일부 코드를 건너 뜁니다. 코드에 무슨 문제가 있는지 모르겠습니다. 그것은 단지getline (cin, variable) 함수가 일부 코드 행을 건너 뜁니다.

enter image description here

+0

스크린 샷을 제거하고 여기에 출력을 게시하십시오. –

+2

전화 번호는 정수가 아닙니다. –

+1

당신은 cin >> contactline 대신 getline (cin, contactnumber) –

답변

3

모두cin.ignore() 명령을 삭제하는 것이 좋습니다. 사용자 입력에 대한 문제의

하나는 대신 당신이 입력하고 싶은의 RETURN 문자를 읽어들이는 getline()getline()로를 따른다면 있도록 >> 운영자가 스트림 밖으로 RETURN 문자를하지 않는다는 것입니다.

그래서 모든 당신의 getline()이 변경 것 :

// cin >> ws will skip any RETURN characters 
// that may be left in the stream 
getline(cin >> ws, lastname); 

을 또한 cin.ignore()모든을 제거 명령. 그들은 getline() 명령 후에 사용할 때 아무런 도움이되지 않고, 내가 보여준대로 getline() 명령을 변경하면 전혀 필요하지 않습니다.

int main() 
{ 
    string getfirstname; 
    string lastname; 
    string address; 
    char response; 
    int contactnumber; 
    int CurrentNumberOfContacts = 0; 

    cout << "Enter First name : "; 
    getline(cin >> ws, getfirstname); 

    cout << "Enter Last name : "; 
    getline(cin >> ws, lastname); 

    cout << "Enter Address : "; 
    getline(cin >> ws, address); 

    cout << "Enter Contact number : "; 
    cin >> contactnumber; 

    CurrentNumberOfContacts += 1; 
    cout << "Successfully added to contact list!" << endl << endl; 

    cout << "Would you like to add another contact ? [Y/N] "; 
    cin >> response; 

    //more lines of codes below 
    return 0; 
} 

엄격하게 getline() 기능의 모든 말하기 cin >> ws 트릭을 사용해야합니다

그래서이 작동합니다.

std::getline(cin >> ws, line); 

그렇지 않으면 바로 사용 : @Galic에 의해

std::getline(cin, line); 
+0

'cin >> lastname'을 사용하는 것이 더 간단 할 것입니다. 자동으로 공백을 무시하고 일반 입력의 경우 (한 줄에 한 단어 씩) 똑같이 작동합니다. – Wug

+0

@Wug 일부 이름은 공백이 있습니다 (예 : Mc Manners 또는 Du Val) – Galik

+0

@Galik 오 예. 나는 그것을'scanf ("% c"')와 섞었다. –

1

cin >>getline 잘 협조하지 않는 번호를 포함하기 때문에 데이터 유형으로 '지능'inputed 한

#include <iostream> 
#include <string> 
using namespace std; 

int main() 
{ 
    string getfirstname; 
    string lastname; 
    string address; 
    int contactnumber; 
    cout << "Enter First name : "; 
    getline(cin, getfirstname); 
    cin.ignore(); 
    cout << "Enter Last name : "; 
    getline(cin, lastname); 
    cin.ignore(); 
    cout << "Enter Address : "; 
    getline(cin, address); 
    cin.ignore(); 
    cout << "Enter Contact number : "; 
    cin >> contactnumber; 
    cin.ignore(); 

    CurrentNumberOfContacts += 1; 
    cout << "Successfully added to contact list!" << endl << endl; 

    cout << "Would you like to add another contact ? [Y/N] "; 
    cin >> response; 

    //more lines of codes below 
    return 0; 
} 

아래의 출력을 참조하십시오. 그들은 공백을 다루는 방법에 대해 다른 전략을 가지고 있습니다. getline은 줄 바꿈 문자를 제거하지만 cin >>은 남겨 둡니다. 즉, cin >>을 사용하여 내용을 읽은 후 입력 스트림에서 "사용"하기 위해 다음 getline을 기다리는 줄 바꿈 문자가 남아 있음을 의미합니다. 즉 문자열에 빈 줄을 읽습니다.

+1

형식화 된 입력을 사용하여 직접 * std :: getline()을 사용하는 경우에만 해당됩니다. 이 경우 형식화되지 않은/형식화되지 않은 입력과는 아무런 관련이 없습니다. – 0x499602D2

+0

결국 그는 이것을 루프로 호출 할 것입니다. 그렇지 않으면 그는 선언문을 포함하는 것을 잊어 버린 'CurrentNumberOfContacts' 변수를 사용하는 것을 꺼려하지 않을 것입니다. – Wug

+0

@Wug는 아마도 언젠가 루프에 들어갈 것입니다. 언젠가는'std :: getline'을 사용할 때'std :: cin'이 다른 텍스트 모드 스트림보다 어떻게 발산되는지에 관해서는이 대답을 부정확합니다. (그렇지 않다), 아마도 * 다음 질문에 대한 답을 알맞은 출발점으로 삼을 것이다. 이건 아니야. – WhozCraig

1

2 가지. 첫째, 당신이 정말로 당신의

cin >> variable 

둘째 전에

getline(). 

를 사용하여이 경우에 cin.ignore()를 필요로하지 않는다, 나는 당신의 프로그램이 실행되지 않는 이유를 모르겠지만

getline() 

전화를 걸고 그 것이 작동하는지 확인하는 것이 좋습니다. 하지만 코드가 작동하지 않는 이유는 없습니다.

1

대답을 제공

을 당신이 std::getline()>> 후 다음 사용하는 사용하는 경우 : I는 다음과 같이 (불완전한) 규칙이있는 가정 아주 좋습니다. 그러나 선행 공백을 버리지 않고 한 줄의 문자를 읽고 싶다면 다른 해결책이 필요합니다.

당신은 할 수 :

char a='\n'; 
while (a=='\n') 
{ 
    cin.get(a); 
} 
cin.unget(); 

첫 번째의 getline을하기 전에. 이것은 이전의 cin으로 인한 후행 공백이없고 첫 번째 입력 행이 비어 있지 않다고 가정합니다.

관련 문제