Written by coh at home

cin, cout 그리고 buffer 본문

languages/c++

cin, cout 그리고 buffer

och 2022. 4. 3. 11:28

도대체 c++에서 왜 객체를 쓰는 걸까. 

cout과 cin을 왜 객체로 모델링 했을까. 그냥 printf scanf 쓰면 되는 거 아닌가.

 

버퍼입력을 사용하기 때문에 그렇다. 

표준입력을 

std::cin >> n

 

cin은 버퍼가 비어있는지를 보게 되고 입력한 데이터를 모두 버퍼로 옮기게 된다. 

우리가 입력에 10 20 30 40 50 엔터를 치게 되면 1 0 공백 2 0 공백 전부 차례로 들어가게 된다

n의 type이 정수이므로 cin은 10을 저장하게 될 것이고 나머지는 여전히 버퍼에 남아있게 된다. 

 

그래서 우리가 이 경우 두 번째 정수 데이터를 받으려고 하면

우리가 입력을 하기 전에 버퍼에 들어가 있는 20을 받게 되고 white space에서 짤라준다. 

나머지 30 40 50은 여전히 버퍼에 남아있다. 

 

이런 경우도 생각해보자

10                              을 입력하는 경우를 생각해보자. white space를 엄청 포함하고 있다.

이 때 두 번째 데이터를 받으려고 하면 어떻게 될까. 

 

버퍼가 white space 뒤에 정수가 있는지 확인을 하게 되고 없으면 키보드로부터 입력을 하라는 커서가 깜빡이게 된다. 

따라서 문제없이 동작할 수 있다. 

 

이제 근데 이런 경우가 큰 문제가 된다. 

정수를 입력받고 문자를 입력받는 경우.

 

15를 입력하고 문자열을 입력하려고 하면 enter가 buffer에 남아있어서 문자열로 들어가게 된다. 

따라서 이때 사용하는 방법 중 하나는 ignore(256, '\n') 방식을 많이 쓴다. 256개의 공백을 무시하거나 \n이 나올 때까지 무시한다는 의미.

 

자 그럼 이제 scanf와의 차이를 살펴보자. 

scanf는 함수를 호출해서 값을 넣어준다. 따라서 주소를 전달해주게 되는데..

어? cin은 주소를 전달하지 않네? 근데도 data가 수정되네? 

 

이것은 참조전달 때문이다. 

 

마지막으로 

std::endl; 은 newline + buffer비움 

 

cout << '\n' 과 cout <<"\n" 둘 다 new line을 실행해 주는데 

음 전자는 char, 후자는 문자열 상수니까 char*를 받게 된다. 

 

 

'languages > c++' 카테고리의 다른 글

문자열  (0) 2022.05.15
[c++]배열, Leetcode26,27  (0) 2022.04.07
bit 연산  (0) 2022.04.04
부동소수 반올림 오차  (0) 2022.04.03
참조변수, 축소변환, auto, decltype  (0) 2022.04.03