scanf() 는 사용자 입력값을 받아 프로그램에 입력할 수 있는(standard input) 함수이다. 이러한 특징에서 프로그램으로부터 출력값이 나오는(standard output) printf() 함수와 함께 다니는 함수로 볼 수 있다. scanf()는 stdio.h 라이브러리에 속해있다.
당연하게도 scanf() 함수를 사용하기 위해선 사용자 입력값이 어떤 데이터 타입인지 알아야 한다.
첫번째 printf 함수 출력 이후 scanf 함수로 사용자 입력값으로 정수를 받는다. 하지만 그 이후의 printf 함수가 출력되지 않고 return 값도 0이 아닌채 프로그램이 종료되는 것을 볼 수 있다.
이것은 단순히 cup이라고 입력할 시 프로그램 상 변수 cup 자체를 보내는 것이 아니라 cup 안에 들어 있는 값을 보내게 된다. 현재 변수 cup 안에는 아무런 값이 들어있지 않으므로 보낼 값이 없어 출력되지 못한 것이다. 이를 해결하기 위해선 변수 cup 자체를 보내야 한다. 즉, 값이 아니라 변수 cup의 주소 &cup을 입력해서 넘겨주어야 한다.
변수 cup의 주소를 입력하자 프로그램이 정상적으로 작동하는 것을 볼 수 있다.
char형도 동일하게 작동한다.
char의 경우 하나의 문자만 받을 수 있으므로 a만 출력된다. 문자열을 출력하기 위해선 char 배열을 구성해야 한다.
배열은 그 자체로 주소를 나타내므로 &없이 a만 입력해도 cup 자체를 보내는 것이 되며 &a[0] 도 배열 cup의 0번째 인덱스 값의 주소를 말하는 것과 동일하다.
현재 코드 상 8개의 문자만 받도록 되어있는 배열인데 그 크기를 넘어가지 않도록
scanf("%s", cup, sizeof(cup));
으로 입력해야 한다. 크기를 넘어서 작성해버리면 심각한 오류가 발생할 수 있기 때문.
또한 배열의 크기와 문자열의 끝을 알리는 Null 값 \0을 반드시 입력하도록 기억해야 한다.
scanf(), printf() 와 비슷한 함수로 gets(), puts() 함수들이 있다.
scanf() 는 문자에서 공백을 입력받지 못하는 반면 gets() 는 공백을 포함해 입력받을 수 있다. 또한 gets와 puts 함수는 Null 값을 따로 입력받지 않아도 된다. 다만 scanf()와 gets() 같은 경우 이전에 심각한 오류가 발생한 적이 있었기 때문에 scanf_s, gets_s 로 사용하기도 한다.