인프런 커뮤니티 질문&답변

말랑말랑한 사자님의 프로필 이미지
말랑말랑한 사자

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

안녕하세요! 버퍼 플러싱 관련하여 질문드립니다.

작성

·

146

·

수정됨

0

교안 32p에 cin을 사용해서 반복횟수를 입력 받고 getline을 사용시에 정수 입력 => 엔터 => 문자열 입력의 흐름이 되고 cin은 개행문자 전까지 입력을 받기 때문에 버퍼에 \n이 남아서 버퍼 플러싱이란걸 해야 함으로 이해했습니다. 그리고 버퍼플러싱이 임시저장소인 버퍼의 데이터를 프로그램에서 사용하기 위해 영구저장소로 가져가는 것임도 확인했습니다.

 

이 과정에서 2가지 여쭙고싶습니다.

 

  1. 위의 문제로 입력 버퍼에 개행 문자가 남아있다면 이후에 데이터를 입력할 때 남아있는 개행문자에 걸려서 오류가 날 것으로 생각합니다. 그래서 따로 남아있는 개행문자를 처리해야되는 것으로 이해했습니다. 제가 이해한게 맞는지 궁금합니다!


  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 함수 등에서 그 개행 문자를 새로운 입력의 시작으로 인식하여 예상치 못한 오류가 발생할 수 있습니다. 따라서 개행 문자를 명시적으로 처리해 줄 필요가 있습니다.

  1. 말씀하신 대로, cin을 사용하여 데이터를 입력 받고 난 후, cin은 개행 문자 전까지의 데이터만 처리하고, 개행 문자는 버퍼에 남겨두게 됩니다. 이로 인해 다음에 getline을 사용할 때, 입력 버퍼에 남아 있던 개행 문자를 먼저 읽게 됩니다. 이 때문에 실제 사용자가 의도한 다음 줄의 입력을 제대로 받지 못하게 됩니다. 그래서 남아 있는 개행문자를 처리하는 것이 필요하고, 이해하신 그 부분이 정확합니다.

  2. string bufferflush; getline(cin, bufferflush); 코드의 원리에 대해서 설명드리면, 이 코드는 cin을 통해 입력 받은 후 남아 있는 개행문자 \n를 처리하기 위해 사용됩니다. 특히, getline 함수는 개행문자를 발견할 때까지 혹은 파일의 끝에 도달할 때까지 입력을 받으며, 여기서 발견된 개행문자를 제외한 나머지를 bufferflush에 저장합니다. 여기서 중요한 점은, 개행문자를 만날 때까지 입력을 받기 때문에, 실제로는 개행문자를 처리(즉, ‘소비’)하는 역할을 합니다. 결과적으로, 이 코드는 버퍼에 남아 있을 수 있는 개행문자를 읽어내고 소비하여 다음 입력을 위해 버퍼를 ‘정리’하는 데 사용됩니다. 그러나 이 경우 bufferflush 변수에는 아무런 데이터도 저장되지 않게 되죠.

이와 관련하여 유사한 질문과 답변을 찾아보니, 동일한 코스에서 비슷한 주제로 질문한 이력이 있습니다. 다음은 해당 내용과 관련된 링크입니다:

위의 링크들과 설명이 말랑말랑한 사자님의 이해를 돕는 데에 도움이 되었길 바랍니다. 더 궁금한 점이 있다면 추가적으로 질문해 주세요.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

이해했습니다 감사합니다

 

말랑말랑한 사자님의 프로필 이미지
말랑말랑한 사자

작성한 질문수

질문하기