Hongfluenza

서식문자와 scanf()함수 본문

카테고리 없음

서식문자와 scanf()함수

Hongfluenza 2018. 3. 15. 10:10

[C-LAB과제 3번]

서식문자와 scanf()함수 조사


scanf()에 대한 서식문자


서식문자 

입력대상(자료형) 

입력 형태 

 %d

int 

부호 있는 10진수 정수 

 %i

int 

부호 있는 10진수 정수 

 %u

unsigned int 

부호 없는 10진수 정수 

 %o

unsigned int 

부호 없는 8진수 정수 

 %x

unsigned int 

부호 없는 16진수 정수 

 %c

char 

문자 

 %s

char * 

문자열 

 %p

void * 

주소 값 

 %f %e %g

float 

부호 있는 실수 




scanf() 함수에 대해 알아보자


scanf()함수는 표준 입력장치(키보드)로부터 데이터를 입력받는다.

리턴값은 성공 시 입력된 데이터 갯수, 실패 시에는 0을 리턴하게 된다.



scanf()함수는 정수, 실수, 문자, 문자열, 구조체까지 입력을 받을 수 있다.




scanf는 주소값(address)을 인자로 가진다.

따라서, 그 변수의 주소값을 반환하는 문자인 &를 변수의 이름 앞에 추가한다.



예)

scanf("%d %f", &age, &weight);



scanf의 작동원리는 공백(탭,스페이스바)이 아닌 첫 번째 글자를 읽는다.

그 이후로 입력될 수 없는 글자를 만나거나(숫자를 받는데 문자를 넣음), 폭을 지정했을 때 그 폭만큼 읽어들이고 종료한다.




%d에 0~9이외의 글자, 즉 숫자이외의 글자를 넣으면 넣어지지 않는다.


에러가 발생하게 되는데, 스페이스바는 받아들여지지 않고, 공백은 다음입력시 무시되므로 

scanf("%d %d %d", &i, &j, &k);가 있을 때, [3 5 7]과 같이 띄어쓰기로 입력이 가능하다. 


scanf함수는 문자열 입력시 입력받을 문자열의 최대 갯수를 제한하지 않기 때문에

버퍼 오버플로우가 발생할 여지가 충분히 있다.

이를 해결하기 위해서, fgets함수를 사용하면 된다.


※fgets 함수는 scanf와 달리 오직 개행 문자에 의해서만 입력이 끝나기 때문에

띄어쓰기가 있는 문자열도 입력 받을 수 있다.