scanf: getcahr, gets함수와 마찬가지로 I/O buffer 사용.

       scanf 사용자가 입력한 문자를 형식문자에 따라

       인자의 주소에 저장하고 숫자, 문자, 문자열을 입력받음.

       현재 scanf함수는 gets함수와 마찬가지로

보안결함이 있으므로 scanf_s 사용(VS에서만)

 


int Date = 0;

scanf_s(“%d”, &Date);

 

Date라는 이름의 변수를 int 선언. 값은 0 초기화

&Date: 이름이 Date 변수의 메모리의 주소

scanf함수가 호출되어 사용자가 숫자 605 입력했다면

버퍼에 문자 6,0,5 저장이 되고

%d형식에 의해서 문자 6,0,5 정수형식으로 해석되어

정수 605 Date라는 식별자의 주소에 저장된다.       

 

&Date 말고 Date 쓰면 어떻게 될까?

실행시키고 값을 입력하면 오류가 발생한.

scanf함수에서 &Date 의미하는 것은

변수 Date 주소를 뜻하고

주소에 사용자가 입력한 값을 저장한다는 것인데

& 떼고 Date만을 입력하게 되면

현재 변수 Date 값은 0으로 초기화되어 있는 상태이고

의미는 0 해당하는 메모리의 주소에

사용자가 입력한 데이터를 덮어쓰기를 하라는 뜻이 되고

주소들은 운영체제가 쓰고 있는 영역이라 오류가 발생하게 된다.


 

scanf_s(“%d, %d”, &a, &b);

printf함수와 마찬가지로 형식문자의 구분을 

, 하는 경우 에러가 발생

scanf함수는 형식문자를 여러 작성할 경우

형식문자 사이의 입력을 구분한다.

위의 같이 형식문자 사이에 , 입력하는 경우

10 20 출력하고자 한다면

정수 10 20만을 입력하면 되는 것이 아니고

정수 10 입력하고 , 반드시 포함시켜야 정상 출력된다

1. 10, 20 이나 2. 10,엔터 20 이런식으로.

따라서 scanf함수의 경우 형식문자 사이에

따로 구분자를 쓰지 않고 붙여서 작성하면 된다.

 

 

만약 scanf함수로 정수를 입력받고

gets함수로 다시 문자를 입력 받으려는 경우

gets함수 특성상 I/O buffer하며

문자열을 입력받는 함수이므로

앞의 scanf함수에서 정수를 입력할 때

정수를 입력하고 엔터를 치면 엔터(개행문자)가

정수와 함께 버퍼에 남게되고 

마지막에는 버퍼에 개행문자만 남게 된다.

그러므로 사용자에게 따로 입력받지 않게 되며

버퍼에 있는 개행문자가 입력되고

원하는 문자를 입력하지 못한채 실행창이 종료되거나

입력되지 않은 값이 그대로 출력되게 된다.

 

예를 들어 scanf함수로 정수를 입력받을

10 입력했다면 1,0,\n 버퍼에 남아있고

scanf 형식문자 %d 문자 1,0 뽑아서

정수형식으로 변수에 저장하고 \n 그대로

버퍼안에 남아있어 다음 입력을 받을

gets함수는 버퍼안에 남아있는 \n

입력데이터로 인식하게 되는 결과가 발생한다.

그래서 문자를 출력하는 함수를 사용할 때는

버퍼의 개행문자까지 신경써야 하겠다.



%*c : 이 명령어는 형식문자는 형식문자대로 

역할을 수행하고  뒤에 남은 글자는 제거라는 뜻.


) scanf_s(“%d%*c”, &변수);

이렇게 하면 %d형식문자에 의해서

사용자가 입력한 숫자를 정수형으로 해석해

변수에 저장하고 남은 개행문자는 버퍼에서 제거한다.

 

다른 방식으로 scanf함수는 그대로 사용하고

다음줄에 getchar();로도 가능

남은 개행문자를 getchar함수에 의해서 입력받음.


예) scnaf_s("%d", &변수);

getchar();


 

scanf_s함수 %s, %c 사용법


변수를 0초기화한다

scanf_s(“%c”, &식별자, sizeof(식별자));


변수를 배열로 선언한다

scanf_s(“%s”, 식별자, sizeof(식별자));




** 잘못알고 있는 것이 있으면 댓글로 알려주시면 감사하겠습니다! **

+ Recent posts