별의 공부 블로그 🧑🏻‍💻
728x90
728x170

입력 함수 : cin(), getline() (and cin.ignore())

들어가며

  • C++입력 함수cin()getline() 함수에 대해 알아보자.
  • 그리고 입력 버퍼를 비우는데 사용되는 cin.ignore() 함수에 대해 간단히 알아보자.

 

cin()

  • <iostream> 헤더에 정의되어 있다.
  • 표준 입력 버퍼에서 공백 혹은 개행 문자(\n) 이전 까지의 값만을 받아들인다.
  • >> 연산자를 사용하여 공백이 포함된 문자열을 입력 받을 경우, 공백 전의 문자만 입력된다는 단점이 존재한다.
    • 공백이 포함된 문자열을 입력받으려면 getline() 함수를 사용해야 한다.
#include <iostream>

int str;
cin >> str;     // "My Blog" 입력
cout << str;    // "My" 출력

 

getline()

  • 다음과 같이 2가지로 나뉜다.
    • <istream> 라이브러리에 속하는 cin.getline()
    • <string> 라이브러리에 속하는 getline()

 

① <istream> cin.getline()

cin.getline(변수 주소, 최대 입력 수, 제한자);
  • C 형식 문자열 방식인 마지막 글자에 'NULL(\0)' 문자가 포함문자 배열을 받는데 사용한다.
  • N-1개의 문자를 읽어와서 문자형 배열에 저장하고, 마지막 문자는 자동으로 NULL로 바꾼다.
  • 세 번째 인자 delim(제한자) 직전까지 읽어서 문자형 배열에 저장한다.
    • 제한자를 별도로 지정하지 않으면 개행문자(\n)로 인식한다. 
#include <istream>

cin.getline(char *s, streamsize n, char delim);

 

② <string> getline()

getline(입력 스트림, string 객체, 구분자);
  • 지정한 구분자(Delimiter)를 만날 때까지 문자열을 입력받아 string 객체에 저장한다.
  • 구분자는 따로 지정해주지 않아도 된다.
#include <string>

// getline(istream& stream, string str, char delim);
string str;
getline(cin, str);

 

getline() 사용 시 주의할 점

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

int main() {
    int val;
    string str;
    
    cin >> val;
    getline(cin, str);
    
    cout << val << str << endl;
}
1
1

 

  • 위의 예시 코드를 실행해 보면 예상과 달리 입력받은 정수만 출력되고 프로그램이 종료된다. 
  • 이런 현상이 발생하는 이유는 표준 입력 버퍼개행문자(\n)가 남아 있기 때문이다.
  • getline() 코드 앞에 cin.ignore() 함수로 버퍼를 비워(Clear)주면 이 문제가 해결된다.
#include <iostream>
#include <string>
using namespace std;

int main() {
    int val;
    string str;
    
    cin >> val;
    cin.ignore();    // Clear Buffer
    
    getline(cin, str);
    
    cout << val << str << endl;
}
1
byeol
1byeol

 

  • cin.clear() 함수 또한 사용할 수 있지만, 이 함수는 입력 버퍼를 비우는 것이 아닌 stream을 good state로 돌려주는 함수이다. 따라서 버퍼를 명확하게 비우기 위해 cin.ignore() 함수를 사용하는 것이 권장된다.
  • cin.ignore() 함수는 C 언어의 fflush(stdin) 함수와 비슷한 역할을 수행한다.

 

cin.ignore() 함수를 사용하기 전 참고할 점

  • 다음을 참고하여 불필요하게 cin.ignore() 함수를 사용하지 않도록 한다.
1. cin으로 입력받을 경우, 버퍼에 '\n'이 남는다.
2. cin 다음 입력을 cin으로 받을 경우, 전 버퍼에 있던 공백 및 개행문자를 무시하기 때문에 버퍼를 굳이 비워줄 필요가 없다.
3. cin 다음 입력을 getline 으로 받을경우, 전 버퍼에 있던 공백 및 개행문자를 포함해서 입력받기 때문에 버퍼를 지워주는 작업이 필요하다.
4. getline 다음 입력을 getline 으로 받을경우, getline '\n' 문자를 버퍼에 포함시키기 않기때문에 버퍼를 비워줄 필요가 없다.
5. Windows와 Linux의 개행 문자 차이, 컴파일러의 차이 등에 따라 실행 결과가 일치하지 않을 수 있다. 

 

 

728x90
그리드형(광고전용)
⚠️AdBlock이 감지되었습니다. 원할한 페이지 표시를 위해 AdBlock을 꺼주세요.⚠️
starrykss
starrykss
별의 공부 블로그 🧑🏻‍💻


📖 Contents 📖