Written by coh at home
cin, cout 그리고 buffer 본문
도대체 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 |