scanf 함수의 원형은


int scanf(const char * format, ...);


이렇게 선언되어 있다.


여기서 const char * format은 형식 문자열 format을 의미하는데


형식 문자열 format에는 서식문자, 공백, 비공백문자 등이 들어갈 수 있다.


(여기서 공백문자는 space, \n, \t 등을 의미하고, 비공백 문자는 공백이 아닌 문자를 의미한다)


scanf는 형식 문자열 format을 왼쪽부터 오른쪽으로 이동하면서 사용자가 입력한 값들에 대입해본다.


문자열 format에 공백문자가 들어가게 되면 scanf는 공백이 아닌 문자를 만날때까지 계속 읽어들인다


ex)


scanf("%d %d\n", &a, &b);


여기서 사용자가 3 5를 입력하고 엔터를 쳤다고 가정하자.


그러니까 입력버퍼에는 3, ' ', 5, '\n' 총 4개가 들어가있는 상태이다.


이제 scanf는 문자열 format인 "%d %d\n" 의 왼쪽에서 오른쪽으로 이동해가며 값들을 찾아낸다


먼저 %d에 해당하는 것을 찾는데, 이때에는 3이 %d에 해당된다.


그리고 scanf는 공백을 만나게 된다. 따라서 공백이 아닌 문자를 만날때까지 계속 읽어들이므로


입력버퍼의 ' '이 읽히고 5를 만난상태에서 검색을 중단한다.


그리고 나서 두번째 %d에 해당하는 값을 찾는다. 이때에는 5가 해당되므로 b에 5를 할당한다.


그리고 마지막으로 \n이 format에 들어있는데 \n 또한 공백문자에 포함된다.


따라서 scanf는 공백이 아닌 문자를 만날때까지 계속 읽어 들인다. 현재 5까지 찾아낸 상태이므로


사용자가 입력한 값에는 이제 \n밖에 남아있지 않다. 


그런데 scanf는 마지막 \n을 읽고나서 공백이 아닌 문자를 만날때까지 계속 읽어들어야 하므로


사용자로부터 공백이 아닌 문자를 입력받을 때 까지 기다리는 상태가 된다.


-----------------------------------------


 scan set 기능


scanf의 서식문자로는 "%10s"의 형태도 있지만 다른 추가적인 것들이 있다


먼저 서식문자 안에 []로 둘러싸여진 문자들의 집합이 올 수 있다.


이때 scanf는 []안에 있는 문자들을 사용자가 입력한 값에서 찾아내며 [] 안의 문자들에 해당하지


않는 문자를 발견하면 검색을 멈춘다


char str[100];

scanf("%[abcde]", str); 


(여기서 두번째 인자에 해당하는 부분은 문자열 배열의 주소여야 한다)


만약 사용자가 daccdgabc를 입력했다고 가정하자.


이때 str에는 daccd가 저장된다. g는 a,b,c,d,e에 해당하지 않는 문자이기 때문이다.


char str[100];

scanf("%[^abcde]", str);


이처럼 [] 의 첫번째에 ^를 입력하게 되면 이때에는 의미가 반대가 된다.


scanf는 [] 안의 문자들이 아닌것만 읽게 된다. 즉 a,b,c,d,e 를 만나게 되면 검색을 중단한다


따라서 사용자가 poibuuba를 입력한다면 str에는 poi 가 들어가게 된다.


이것을 이용하면 scanf로 gets를 흉내낼 수 있다


scanf("%s", str); 이라고 해놓고 사용자가 입력을 my name is 라고 입력하면


str에는 my만 들어가게 되지만,


scanf("%[^\n]", str); 이라고 해놓고 사용자가 입력을 my name is 라고 입력하면


str에는 my name is가 들어가는 것을 확인할 수 있다. scanf는 my name is'\n' 중에서


'\n'이 나타날때까지 값을 모조리 읽어들이기 때문이다. 거기다 추가로


scanf("%[^\n]%*c", str); 이라고 하면 입력버퍼에 남겨진 \n까지 지울 수 있다.




두번째로 * 이라는 기호가 있는데 이는 할당 금지를 지정하는 서식문자이다


scanf("%d%*c", &a); 라는 문장에서


사용자가 5를 입력하고 엔터를 치면 입력버퍼에는 5, '\n'이 들어가게 된다.


이때 scanf는 %d에 해당하는 5를 가져오고, %c에 해당하는 문자 하나를 지워버린다.


즉 %c에 해당하는 \n을 발견하고서 \n을 입력버퍼에서 없애버린다.


또한


scanf("%[qwert]%*[abcde]", str); 이런식으로 쓸수도 있다.


사용자가 입력을 ewrqbewecda 이런식으로 입력을 하면 str에는 ewrq가 들어가며


be는 삭제되어 최종적으로 버퍼에는 wecda'\n'만 남아있게 된다.




'C > 공개글' 카테고리의 다른 글

printf와 puts와 fputs  (0) 2013.01.23
printf의 서식  (0) 2013.01.23
key sum  (0) 2013.01.23
문자열 뒤집는 알고리즘  (0) 2013.01.23
널과 널 문자열과 널 포인터  (0) 2013.01.22
Posted by huammmm1
,