http://stackoverflow.com/questions/6083045/scanf-n-skips-the-2nd-input-but-n-does-not-why
http://in.answers.yahoo.com/question/index?qid=20110318044732AAaBz8P

위 두 링크에서 배웠습니다


scanf로 입력 받을 때 매번 \n을 fflush(stdin)으로 빼버리는 것도 뭔가 좀 걸리적 거리기도 하고
성능상 불 이익이 있을 것 같은 느낌이 들어서 좀 찾아봤습니다

재미있는 좋은 팁을 얻었네요

1. scanf의 포맷팅을 미리 char*형으로 선언해놓기
2. *지시자
3. [^]xor 용법


char* fmt = "%[^\n]%*c";

char str1, str2;
scanf(fmt, &str1);
scanf(fmt, &str2);


해설
1. 키보드로 입력한다
2. stdin이라는 일종의 버퍼(메모리)로 값이 들어간다
3. scanf 함수가 이제 그녀석을 차례로 순서대로 읽기 시작한다
쉽게 이해를 해보자면 stdin은 일종의 배열로 scanf는 pointer로 루프문 탐색을 시작한다고 보면 된다

4. []는 그 안에 있는 것만 받고 싶습니다 하는 그런거라 보면 된다

5. ^는 xor연산이다
다르면 1이고 같으면 무조건 0이다
그런고로 \n과 같은 값이면(\n도 일종의 숫자값이다) 0을 넘기고
다르면 1을 넘긴다 즉 2진 연산을 통해서 \n만 걸러낸다고 보면 된다

즉 %[^\n] 는 scanf가 stdin에 입력된 글자 한자 한자를 살펴보면서 \n인가 체크 하고
\n이 아닌놈만 읽어낸다는 의미이다


6. \n을 제외한 나머지 글자들은 모두 읽히고 \n은 그대로 stdin에 남아있게 된다

7. *는 걍 포인터 버려라는 의미이다
즉 scanf는 stdin에 혼자 남아있는 \n을 읽긴 읽는데 *때문에 걍 버린다
8. 끝
그런고로 fflush(stdin)을 사용할 필요 없이 그냥 *제한자로 간단히 처리가 되어버렸다

'devel > man & example' 카테고리의 다른 글

arm inline assembly  (0) 2011.12.24
thread starvation  (0) 2011.12.09
function pointer  (0) 2009.11.24
sprintf int to ascii  (0) 2009.11.08
C++ , C File OUTPUT e.g.  (0) 2008.12.02
Posted by 쵸코케키

블로그 이미지
chocokeki
쵸코케키

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.4
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

최근에 올라온 글

최근에 달린 댓글

글 보관함