2013-08-28 2 views
0

나는 편지를 입력하라는 간단한 프로그램을 작성하고 있습니다. 그리고 나서 그에게 한 마디를 입력하라고합니다. 그것은 단지 하나의 문자열 일 때 나는 문제가 없습니다.char와 그 다음 문자열을 입력하도록 사용자에게 묻습니다.

char c; 
string s; 
cin >> c; 
cin >> s; 

그러나 사용자가 문자를 입력 한 후 내가 프로그램을 실행할 때 나는 문구

cin >> c; 
getline(cin, s); 

을 원하는 안타 내가 입력 할 수있는 기회 문구를하지 않는 입력 할 때. 물론 문자를 입력하고 공백 뒤에 구문을 입력하면 프로그램이 올바르게 작동합니다.

반대로 문자를 입력 한 다음 첫 번째 방법을 사용하여 공백 다음에 단일 문자열을 입력하면 문자열을 기록하지 않습니다.

왜 이렇게합니까?

+3

'cin.ignore()'...를 사용하거나''''과''getline'을 섞는 것을 멈추십시오. 두 가지 중 하나만 사용하십시오 (둘 다 사용하지 마십시오). –

답변

3

문자를 쓰고 Enter 키를 누를 때 Enter 키를 누르면 실제로 문자 2 개가 버퍼에 전송됩니다. 문자 자체는 \n입니다. cin >> c;은 버퍼에 여전히 \n이 남아있는 동안에 만 첫 번째 문자를 읽습니다. std::getline()\n 문자를 만나기 전에 모든 것을 읽습니다. 문자가 읽히지 않고 프로그램이 종료되면 \n 문자가 첫 번째 문자이기 때문에 읽습니다. std::cin.ignore(); (\n 무시)을 std::getline 앞에 추가하면 코드가 작동합니다.

+0

getline() 대신 cin을 사용하는 문자열 입력의 경우이 개념이 다른 점은 무엇입니까? 내가 cin >> s를 사용할 때; after cin >> c; 그것은 잘 작동하는 것 같습니다. – Ares

+1

'std :: cin()'은 개행 문자가 아닌 첫 번째 문자와 공백 문자가 아닌 문자를 찾아서 문자를 만날 때까지 읽습니다. 그래서'\ n'은 건너 뜁니다. –

0

c는 문자 만 가져 오므로 사용자가 입력 한 Enter 키는 s에 주어 지므로 그 이외의 문자는 기록되지 않습니다. 단 하나의 키를 누르고 문자를 입력하지 마십시오. 또는 어쨌든 문자열을 사용하십시오.

관련 문제