반응형
상황
do-while문과 cin을 사용해
특정 값이 입력되기 전까지는 반복해서 입력을 받아 입력에 따른 작업을 하도록 했다.
그런데 특정 입력 부분만 되면
입력하고 엔터를 치는 순간 내가 이상한 값을 계속 입력하고 있는 것처럼 혼자 무한 루프를 돌았다
해결
cin은 입력받은 값이 입력을 저장하려는 변수의 자료형과호 호환되지 않으면
입력을 받지 않고 입력버퍼에 그대로 남겨둔 채 다음으로 넘어간다
입력버퍼에 남아있는 값이 다음 입력으로 인식되어서
무한루프를 도는 것처럼 보이게 된다.
cin 입력값과 저장하려는 변수의 자료형이 맞는 지 확인하자
해결
그 외 알게된 것
- cin : 입력버퍼의 개행문자나 공백 직전 값까지를 가져온다. 입력버퍼에 개행문자를 남겨둠. 개행문자를 남겨둬서 cin >>사용 후 cin.getline을 쓰기전에 이 개행문자를 지워줘야 함. 하지만 cin을 연속으로 입력받을 때에는 이 개행문로 인한 문제가 없다(왜지?)
- cin.ignore() : 입력 버퍼를 비울 수 있다. 다만 이걸 cin cout 사이사이에 사용하면 그 지점에서 프로그램이 멈춘다.(종료되는 건 아니고 그냥 그 지점에서 멈춰있다. 키를 하나 눌러주거나 하면 이어서 실행된다.)
- cin.getline(char[], n, '\n') : char[]에는 입력값을 저장할 배열이름을 넣는다. n에는 입력받을 제한 길이(배열길이를 넣으면 되겠지)를 넣는다. 주의할 점이 cin은 n-1만큼까지만 입력받아오고 널문자 자리를 남겨놓은 것이라 마지막에 널문자를 자동으로 추가한다. '\n'문자 직전까지만 입력받는다. 이 문자는 다른 걸로 설정할 수 있다. 꼭 ""가 아니라 ''로 감싸서 한 글자의 char로 지정할 것. 사용 전에 cin.ignore()로 직전 cin이 남겨두고 간 개행문자를 제거해줘야 함.
- cin.fail() : 방금 실행한 입력이 정상적으로 잘 실행되지 않았다면 true를 반환. 입력값이 숫자여야 하는데 문자가 입력되는 등의 경우를 확인할 수 있다.
- cin.clear() : 입력값의 자료형이 맞지 않는 등의 이유로 cin객체 내부가 cin.fail() == true 인 오류상태가 되었을 때, 아무 처리 없이 다음 입력을 받으면 cin객체 내부가 오류상태 그대로이므로 입력을 받을 수 없고 오류가 난다. cin.clear()는 내부 초기화를 통해 오류상태를 제거해 다른 입력을 받을 수 있도록 한다. 하지만 잘못된 값을 입력받은 경우 cin.clear()한 후에 반드시 cin.ignore()로 해당 입력을 더 이상 인식하지 않도록 잘못 입력된 값을 제거해 주어야 한다.
반응형
'C&C++ > C++' 카테고리의 다른 글
[C++] 나의 C 구멍막기 : 생성자 사용, 동적 할당된 객체 배열 선언, new와 delete (0) | 2021.10.21 |
---|