작성
·
146
·
수정됨
0
교안 32p에 cin을 사용해서 반복횟수를 입력 받고 getline을 사용시에 정수 입력 => 엔터 => 문자열 입력의 흐름이 되고 cin은 개행문자 전까지 입력을 받기 때문에 버퍼에 \n이 남아서 버퍼 플러싱이란걸 해야 함으로 이해했습니다. 그리고 버퍼플러싱이 임시저장소인 버퍼의 데이터를 프로그램에서 사용하기 위해 영구저장소로 가져가는 것임도 확인했습니다.
이 과정에서 2가지 여쭙고싶습니다.
위의 문제로 입력 버퍼에 개행 문자가 남아있다면 이후에 데이터를 입력할 때 남아있는 개행문자에 걸려서 오류가 날 것으로 생각합니다. 그래서 따로 남아있는 개행문자를 처리해야되는 것으로 이해했습니다. 제가 이해한게 맞는지 궁금합니다!
32p의 버퍼 플러싱 코드에서
string bufferflush;
getline(cin, bufferflush);
의 코드로 남아있는 개행문자를 버퍼 플러싱 해주는것으로 사료되는데, 위 코드가 어떤 원리로 남아있는 개행문자를 처리해주는지 이해가 가지않습니다.. ㅠ
답변 2
0
안녕하세요 사자님ㅎㅎ
cin은 개행문자 전까지 입력을 받기 때문에 버퍼에 \n이 남아서 버퍼 플러싱이란걸 해야 함으로 이해했습니다
>>네 맞습니다.
다만 cin 자체만으로는 버퍼플러싱 안해도 됩니다.
cin>> 문자열 입력받음 -> 그 다음 getline을 연속으로 입력받을 때 버퍼 플러싱이 필요합니다.
위의 문제로 입력 버퍼에 개행 문자가 남아있다면 이후에 데이터를 입력할 때 남아있는 개행문자에 걸려서 오류가 날 것으로 생각합니다.
>> 네 맞습니다. 입력버퍼에 개행문자가 남아있다면 오류가 발생할 수도 있습니다. 다만 cin같은 경우 개행문자 단위로 입력을 받기 때문에 연속적으로 cin을 사용해서 개행문자로 분리가 된 문자열은 문제 없이 받을 수 있습니다.
ex) 연속적인 문자열을 담는 코드.
예를 들어 aa bb cc 를 이렇게 하게 되면 정상적으로 aa bb cc 가 담아지게 됩니다.
// Online C++ compiler to run C++ program online
#include <bits/stdc++.h>
using namespace std;
string tmp[3];
int main() {
for(int i = 0; i < 3; i++){
cin >> tmp[i];
}
for(int i = 0; i < 3; i++){
cout << tmp[i] << " ";
}
return 0;
}
입력과 출력
aa bb cc
aa bb cc
string bufferflush;
getline(cin, bufferflush);
의 코드로 남아있는 개행문자를 버퍼 플러싱 해주는것으로 사료되는데, 위 코드가 어떤 원리로 남아있는 개행문자를 처리해주는지 이해가 가지않습니다.. ㅠ
>> cin으로 남아있는 개행문자를 없애기 위한 임시 문자열을 선언하고 해당 부분을 전부 getline()으로 받아 없애는 것입니다.
또 질문 있으시면 언제든지 질문 부탁드립니다.
좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.
0
안녕하세요, 인프런 AI 인턴입니다.
말랑말랑한 사자님의 질문에 대해, 버퍼 플러싱과 관련하여 이해하신 부분이 정확하게 맞습니다. 먼저, 개행 문자 \n
이 입력 버퍼에 남아있을 경우, 다음 입력을 받는 getline
함수 등에서 그 개행 문자를 새로운 입력의 시작으로 인식하여 예상치 못한 오류가 발생할 수 있습니다. 따라서 개행 문자를 명시적으로 처리해 줄 필요가 있습니다.
말씀하신 대로, cin
을 사용하여 데이터를 입력 받고 난 후, cin
은 개행 문자 전까지의 데이터만 처리하고, 개행 문자는 버퍼에 남겨두게 됩니다. 이로 인해 다음에 getline
을 사용할 때, 입력 버퍼에 남아 있던 개행 문자를 먼저 읽게 됩니다. 이 때문에 실제 사용자가 의도한 다음 줄의 입력을 제대로 받지 못하게 됩니다. 그래서 남아 있는 개행문자를 처리하는 것이 필요하고, 이해하신 그 부분이 정확합니다.
string bufferflush; getline(cin, bufferflush);
코드의 원리에 대해서 설명드리면, 이 코드는 cin
을 통해 입력 받은 후 남아 있는 개행문자 \n
를 처리하기 위해 사용됩니다. 특히, getline
함수는 개행문자를 발견할 때까지 혹은 파일의 끝에 도달할 때까지 입력을 받으며, 여기서 발견된 개행문자를 제외한 나머지를 bufferflush
에 저장합니다. 여기서 중요한 점은, 개행문자를 만날 때까지 입력을 받기 때문에, 실제로는 개행문자를 처리(즉, ‘소비’)하는 역할을 합니다. 결과적으로, 이 코드는 버퍼에 남아 있을 수 있는 개행문자를 읽어내고 소비하여 다음 입력을 위해 버퍼를 ‘정리’하는 데 사용됩니다. 그러나 이 경우 bufferflush
변수에는 아무런 데이터도 저장되지 않게 되죠.
이와 관련하여 유사한 질문과 답변을 찾아보니, 동일한 코스에서 비슷한 주제로 질문한 이력이 있습니다. 다음은 해당 내용과 관련된 링크입니다:
강의 교안 관련 getline() 질문에서는 getline을 여러 번 사용할 상황에서 버퍼플러시를 왜 해야 하는지 설명하고 있습니다.
알고리즘 교안 공부중에 25쪽 버퍼 플래쉬 관련 질문이 있습니다.에서는 cin 후에 getline을 사용할 때 버퍼 플러시를 왜 하고, 어떻게 하는지에 대해 설명합니다.
위의 링크들과 설명이 말랑말랑한 사자님의 이해를 돕는 데에 도움이 되었길 바랍니다. 더 궁금한 점이 있다면 추가적으로 질문해 주세요.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
이해했습니다 감사합니다