이번에는 변수를 출력하는 것으로만 끝나는 것이 아닌, 직접 사용자가 값을 입력하는 방법에 대해서 알아보자
출력할 때는 printf( )함수를 사용했다면 사용자의 입력을 받을 수 있는 함수는 scanf( )이다.


scanf("형식 지정자", &변수이름); 의 형태로 표현한다
printf( )와 마찬가지로 같은 형식 지정자를 사용하고, scanf의 경우 저장할 변수의 앞에 &를 붙인다. &는 주소값을 나타내는 문자로, 변수 이름 앞에 &가 붙으면 그 변수의 주소를 나타내게 된다. 즉, 입력받은 값을 저장하는 변수의 주소를 알려주는 것이다
여기서 주의할 점은 scanf를 쓸 때 변수 앞에 &를 사용하지 않으면 scanf는 입력받은 값을 어떤 변수의 주소에 저장할 지 모르기 때문에 에러가 발생한다. &a는 a의 주소값이지만, a 자체는 주소값이 아니기 때문이다.

scanf("형식지정자 형식지정자 ...", &변수, &변수, ...); 처럼 작성하면 scanf( )도 printf( )처럼 여러 개를 입력받을 수 있다

scanf( )의 동작 원리를 알아보자
사용자가 키보드로 값을 입력하면 데이터는 바로 변수에 저장되는 것이 아니라 먼저 입력 버퍼(Buffer)에 저장된다
예를 들어 사용자가 123을 입력하면 실제로 버퍼에는 '1' '2' '3' '\n' 이 저장된다.
여기서 \n은 엔터키를 눌렀을 때 들어가는 개행 문자이다.
여기서 버퍼(Buffer)란, 데이터를 임시로 저장하는 메모리 공간이다.
키보드 입력 시 사용자가 입력한 값은 먼저 입력 버퍼에 저장되고, 이후 scanf( )가 데이터를 읽어간다.
scanf( )는 필요한 데이터만 읽고 나머지는 버퍼에 남겨둔다.
그래서 scanf( )함수에 버퍼 문제가 발생하는 경우가 있다.

여기서 사용자가 10을 입력하고 엔터를 눌렀다고 가정하자
그렇다면 버퍼에는 '1' '0' '\n' 이 되고, %d는 10만 읽고 \n가 버퍼에 남을 것이다.
그리고 다음 scanf( )에서 %c가 실행되면 사용자의 입력을 받을 새도 없이 남아있던 \n를 읽고 종료해버린다.
따라서 문자 입력이 제대로 동작하지 않는 문제가 발생한다.
이런 버퍼 문제를 해결하는 여러 방법들 중 하나가 scanf( )함수의 형식지정자 앞에 공백을 사용하는 것이다.
scanf(" %c", &ch); 처럼 %c 앞에 공백을 넣으면 버퍼에 남아있는 공백 문자와 줄바꿈 문자를 무시해서 버퍼에 남아있는 문자가 엉뚱한 곳에 입력받도록 하는 것을 막는다.
즉, 앞에 엔터나 스페이스를 여러 번 입력해도 모두 무시하고 마지막에 입력한 숫자/문자만 읽는다는 것이다.
scanf( )함수는 단순히 %d, %c만 사용하는 함수가 아니라 이 외에도 많은 기능들이 존재한다.
형식 문자열 안에 문자, 공백, 억제 문자, 폭 제한, 문자 집합 등을 넣어서 매우 다양한 입력 처리가 가능하다.
형식 문자열이란, scanf( )함수 안에 형식지정자가 들어가는 " "부분을 의미한다.
다양한 기능들 중 몇가지만 알아보자
첫 번째는 scanf( )는 성공적으로 입력받은 개수를 반환한다.

a와 b 변수를 입력받도록 하고 그 반환값을 result 변수에 대입하였다.

두 정수를 입력하고 엔터를 누르면 몇 개가 성공적으로 입력되었는지 확인할 수 있다.
이것을 활용해서 입력이 제대로 되었는지 아닌지 검사하는 것도 가능하다.
두 번째는 형식 문자열에 일반 문자를 넣으면 입력도 반드시 동일하게 설정이 가능하다

예를들어 형식 문자열 안에 x=%d라고 적어놓으면

사용자는 입력시 반드시 x=을 먼저 입력하고 값을 입력해야 한다.

만약 x=을 입력하지 않으면 원하지 않는 결과가 발생할 수 있다.


이는 여러 문자를 조합해도 되고, 괄호나 쉼표도 사용 가능하다.
세 번째는 입력 폭을 제한하는 것이다.


이런 식으로 형식 지정자에 숫자를 추가하면 아무리 길게 숫자를 입력한다고 해도 제한된 자리 수만큼만 출력이 되고,
나머지 3456789는 버퍼에 남는다.
scanf( )의 더 많은 기능들은 C언어 기초-17 <문자열> 글에서 알아보자
VR게임 개발을 위한 언리얼엔진/C++ 공부한 내용 끄적이기...
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!