컴공생의 다이어리
[c++] cin (입력 받기) 본문
아래와 같은 코드를 실행하면 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'), 버퍼에서 무시한다(두 번째 인자를 포함).
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