-
카테고리
-
세부 분야
프로그래밍 언어
-
해결 여부
해결됨
cin.ignore() 관련해서 질문이 있습니다!
23.05.26 23:40 작성 조회수 296
1
#include <iostream>
using namespace std;
int main()
{
char str1[50];
char str2[50];
char str3[50];
cin.get(str1, 50);
cout << "1: " << str1 << endl;
//cin.ignore(); 첫 번째 ignore
cin.get(str2, 50, '\n');
cout << "2: " << str2 << endl;
//cin.ignore(); 두 번째 ignore
cin.get(str3, 50, '\n');
cout << "3: " << str3 << endl;
}
cin.ignore()이 첫 번째 자리에 있을 때는 str2가 매개변수인 get이 '\n'을 무시하고 입력을 받는데 두 번째 자리에 cin.ignore()이 있을 때는 '\n'을 무시하지 않고 즉시 호출되고 끝납니다. 왜 이렇게 되나요?
두 번째 자리에만 ignore()이 있을 때 cin.get(str2,50,'\n') 함수가 버퍼에 남아있는 '\n'을 받은 후에도 버퍼에 계속 남아 있나요?
<실행 결과> (첫 번째 자리의 ignore만 있을 때)
wendy
1: wendy
irene
2: irene
3:
<실행 결과> (두 번째 자리의 ignore만 있을 때)
wendy
1: wendy
2:
3:
답변을 작성해보세요.
1
Soobak
2023.05.27
안녕하세요, 답변 도우미 Soobak 입니다.
코드라인 cin.get(str2, 50, '\n');
에서 get()
함수는 세 번째 매개변수로 지정한 종료문자 '\n'
을 만나게되면 읽기를 멈추지만, '\n'
을 버퍼에서 제거하지는 않습니다.
따라서, 위의 코드에서 두 번째 cin.ignore();
만 주석 처리 되어 있지 않다면, cin.get(str1, 50);
으로부터 남은 '\n'
이 제거되지 않아 cin.get(str2, 50, '\n');
은 해당 '\n'
을 만나 바로 읽기를 종료하게 됩니다.
반면, 첫 번째 cin.ignore()
가 주석 처리가 되어있지 않았을 때에는, cin.get(str1, 50);
로부터 남은 개행문자를 cin.ignore();
로 제거하였기 때문에 cin.get(str2, 50, '\n');
은 새로운 입력을 기다릴 수 있게 됩니다.
chaerynate
질문자2023.05.27
두 번째 자리에 cin.ignore();
이 있을 때 cin.get(str2, 50, '\n');
이 '\n'을 읽어내고 종료하게 되고 나서 cin.get(str3, 50, '\n');
이 실행되지 않는 이유는 뭔가요?
Soobak
2023.05.27
안녕하세요, 답변 도우미 Soobak 입니다.
처음 설명 드린 부분처럼, get()
함수는 세 번째 매개변수로 지정한 종료문자 '\n'
을 만나게되면 읽기를 멈추지만, '\n'
을 버퍼에서 제거하지는 않습니다. 읽어낸다라는 표현에서 혼동을 드린 것 같네요.
조금 더 자세히 설명드리면 다음과 같습니다.cin.get(str2, 50, '\n')
이 '\n'
을 만나 읽기를 멈춘 후에도, '\n'
은 여전히 입력 스트림 버퍼에 남아있게 됩니다.
이후 cin.ignore()
함수가 '\n'
한 문자를 입력 스트림 버퍼에서 제거하게 되지만, 이전 cin.get(str2, 50, '\n')
호출 시 아무 것도 입력되지 않고 종료된 상태, 즉, 추가 입력이 없는 상태가 되었으므로 cin.get(str3, 50, '\n')
역시 바로 종료되게 됩니다.
따라서, 아래와 같이 각 cin.get()
함수 호출 이후에 cin.ignore()
을 사용하여 버퍼에 남아있는 개행 문자를 올바르게 제거해주어야 다음 cin.get()
함수에서 원하는 문자열을 제대로 읽을 수 있게 됩니다.
#include <iostream>
using namespace std;
int main()
{
char str1[50];
char str2[50];
char str3[50];
cin.get(str1, 50);
cout << "1: " << str1 << endl;
cin.ignore();
cin.get(str2, 50, '\n');
cout << "2: " << str2 << endl;
cin.ignore();
cin.get(str3, 50, '\n');
cout << "3: " << str3 << endl;
return 0;
}
답변 1