상세 컨텐츠

본문 제목

cin, getline skipping input

c++

by Riella 2020. 9. 3. 12:25

본문

728x90

Reference: https://rainflys.tistory.com/75

Code Reference: https://www.cprogramming.com/tutorial/lesson6.html

Reference 2: https://jhnyang.tistory.com/107 여기에도 정말 잘 설명되어있다.

#include <iostream>
 
using namespace std;
 
int main()
{ 
  int x;            // A normal integer
  int *p;           // A pointer to an integer
 
  p = &x;           // Read it, "assign the address of x to p"
  cin>> x;          // Put a value in x, we could also use *p here
  cin.ignore();
  cout<< *p <<"\n"; // Note the use of the * to get the value
  cin.get();
}

cin.ignore() after cin?

숫자를 받고 Enter을 치는데 \n이 여전히 input stream에 남아있다

그래서 cin.ignore(numeric_limits<streamsize>::max(),'\n')를 써서 \n을 무시해주는게 안전하다.

물론 cin만 쓸때는 괜찮다. 공백이 버퍼에는 담겨있어도 띄어쓰기나 newline을 무시하기 때문이다.

하지만 getline()이랑 섞어 쓸때는 주의해야한다.

getline()자체는 '\n'을 버퍼에 담지 않아서 줄바꿈이 무시되지만, cin이랑 같이 쓰면 버퍼에 담긴 여백들이 나올거다.

아래는 시험삼아 적어본 cin.cpp이다.

 

#include <iostream>
#include <istream>
#include <string>
#include <limits> //for numeric limits


using namespace std;

int main() {
    int age; int *age_p;
    age_p = &age;
    int num;
    string first_name; 
    string last_name;
    cout << "Enter your age: ";
    cin >> age;
    //using number large enough is okay too
    cin.ignore(numeric_limits<streamsize>::max(),'\n'); //if you comment out this, next cin will be neglected
    cout << "Enter your First Name: ";
    getline(cin, first_name);
    //cin >> first_name;
    //cin.ignore(numeric_limits<streamsize>::max(),'\n');
    cout << "Enter your Last Name: ";
    cin >> last_name;
    //cin.ignore(numeric_limits<streamsize>::max(),'\n');
    cout << first_name << " " << last_name << "\'s age: " << *age_p << endl;
    cout << "Press enter to end";
    cin.get();
}

첫번째: cin.ignore해줬을때, 두번째: 안해줬을때

첫번째 사진은 cin.ignore을 해줘서 제대로 나온 결과, 두번째는 코드 상의 cin.ignore(...)을 빼고 돌린 결과다.

 

그리고 마지막의 cin.get()이 왜 있는지 의아했는데

cin이 cin.get() 또는 cin.getline()을 만나면 개행을 만나버려서 종료된다고 한다.

cin.clear()은 cin의 error flag를 지워준다고 한다.

관련글 더보기

댓글 영역