ignore

2020. 9. 24. 02:41컴퓨터 수업/C++

@istream의 멤버함수 ignore

istream& ignore (streamsize n = 1, int delim = EOF);

@ignore의 파라미터

n까지는 무시 안하고, delim과 같은 문자열 이하는 모두 무시한다.

 

@여러 stream flags

#사용법

cin.setf(ios::showbase);

@문제가 되는 예시

1 char ch1;
2 char ch2;
3 //ch1, ch2 : enter “ z”. ( space + z )
4 cin >> ch1;
5 cout << "(" << ch1 << ")" << endl;
6 cin.ignore(); // enter가 다음 cin으로 들어가지 않도록 해줌
7 cin.unsetf(ios::skipws);// space도 입력으로 생각하게 함
8 cin >> ch2;
9 cout << "(" << ch2 << ")" << endl;

@stream은 진짜 흐름이다. 내가 뭘 입력하든지 간에 일단은 다 받는다

예를 들어 space + z + enter + space + z라고 입력했다고 치자. " z(enter) z"

그렇다면 space + z + enter를 행한 순간 5행의 실행은 끝이 난다.

 

그리고,

 

6행만 있다고 생각하자, 그렇다면 enter를 무시하는 것이니, 8행으로 가서, 다시 space를 무시하고 (z)를 출력할 것이다.

결과:

(z)

(z)

 

7행만 있다고 생각하자, 그렇다면 enter, space, tab 모두를 무시하지 않는다, 따라서 통념적으로 8행에서 space + z를 하게 될 것이라 생각하지만 먼저 "스트림"이라고 얘기하지 않았는가, 흘러온 enter는 사라지지 않는다. enter가 없어지지 않았기 때문에, ch2는 먼저 키보드로 입력받은 enter가 되어 8행을 새로 실행할 필요도 없이 결과는 다음과 같이 나온다.

결과:

(z)

(

)

 

6행과 7행이 모두 있다고 생각하자.

6행의 ignore에 의해 입력된 enter 스트림은 무시된다. (슝~)

7행의 unsef(skipws)에 의해 enter, space, tab을 무시하지 않는다 (하지만 이미 흘러왔던 enter는 이미 날아가고 없다 ㅠ)

 

따라서 이 상황에서 space + z를 입력하게 되면 , space를 무시하지 않아 결과는 다음과 같이 나온다.

결과:

(z)

( )

 

만약 6행과 7행이 서로 자리를 바꿨다고 생각해보자.

6행에 의해 enter, space, tab 모두를 무시하지 않는다, 이미 스트림으로 입력된 enter 또한 무시되지 않을 것이다.

그리고 7행의 ignore에 의해 입력되었던 enter가 사라진다 ㅠㅠ 따라서 결과는 다시 아래와 같을 것이다.

결과:

(z)

( )

 

 

ifstream instance. ignore(); 입력 버퍼에 들어있던 값 모두 제거

 

'컴퓨터 수업 > C++' 카테고리의 다른 글

Function Pointer  (0) 2020.10.02
포인터  (0) 2020.09.28
string 라이브러리  (0) 2020.09.23
디버깅  (0) 2020.09.18
빌드,컴파일  (0) 2020.09.18