컴공생의 다이어리

[c++] cin (입력 받기) 본문

Development/C & C++

[c++] cin (입력 받기)

컴공 K 2021. 1. 2. 23:58

아래와 같은 코드를 실행하면 t를 int가 아닌 문자를 입력받는다면 cin에 fail비트가 켜진 상태이므로, 플래그를 초기화하지 않는 이상 cin을 이용하여 입력을 받을 수 없다(문자열 s를 입력받지 못함).

#include <iostream>
#include <string>
int main() {
	int t;
	std::cin >> t; // 고의적으로 문자를 입력하면 failbit 가 켜진다
	std::cout << "fail 비트가 켜진 상태이므로, 입력받지 않는다" << std::endl;
	std::string s;
	std::cin >> s;
}

 

따라서 이를 해결하려면 아래와 같이 코드를 작성해야 한다.

#include <iostream>
#include <string>

int main() {
	int t;
	while (true) {
		std::cin >> t;
		std::cout << "입력 :: " << t << std::endl;
		if (std::cin.fail()) {
			std::cout << "제대로 입력해주세요" << std::endl;
			std::cin.clear(); // 플래그들을 초기화 하고
			std::cin.ignore(100, '\n'); // 개행문자가 나올 때 까지 무시한다
		}
		if (t == 0) break;
	}
}

fail함수는 ios에 정의되어 있으며, failbit가 true거나 badbit가 true면 true를 리턴한다. 만약 숫자가 아닌 것을 입력한다면 failbit가 true이므로, std::cin.fail()은 true가 되어 조건문을 실행하게 된다.

clear함수는 ios에 정의되어 있으며, 인자를 주지 않을 경우 플래그를 goodbit로 초기화 시킨다. 따라서 fail상태를 지울 수 있다.

ignore함수는 istream에 정의되어 있다. 최대 첫번째 인자 만큼(100), 두 번째 인자가 나올 때까지('\n'), 버퍼에서 무시한다(두 번째 인자를 포함).

 

 

modoocode.com/312

 

씹어먹는 C++ 강좌 - PDF 파일

 

modoocode.com

 

728x90

'Development > C & C++' 카테고리의 다른 글

[c++] 파일 입출력  (0) 2021.01.03
[c++] 형식 플래그(format flag)와 조작자(Manipulator)  (0) 2021.01.03
[c++] string 관련 함수  (0) 2020.12.27
[c++] const 함수  (0) 2020.12.27
[c++] 레퍼런스를 리턴하는 함수  (0) 2020.12.27
Comments