C study

C) scanf함수에 대해 자세히 파헤쳐 보자

mhe1239 2024. 11. 20. 00:05

문자열을 받기 위해서는 대표적으로 C에서는 scanf함수, C++에서는 cin함수, python에서는 input함수 등이 있다.

사용자가 입력한 값을 받는 것은 결국에는  문자열 형태로 전달되기에 이를 쪼개서 형식에 맞게 내가 int로 선언한 변수이면 이를 int로 변환시키는 과정이 입력 함수가 하는 일이다.

 

현재 scanf함수의 경우 Visual Studio에서는 보안 문제로 scanf_s를 대신 써야하거나

#define _CRT_SECURE_NO_WARNINGS 또는 #pragma warnings(disable: 4996)를 #include 헤더 파일 위에 적어야 오류 메시지를 넘기기도 한 상태로 조금 버려진 상태이지만 한번 분석해보는 것도 나쁘지 않을 것이라 생각한다.

 

int scanf(
   const char *format [,
   argument]...
);

이것이 scanf함수의 구조이다.

기본적인 사용 예:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int n;
int main() {
	scanf("%d", &n);
	printf("%d", n);
}

int

앞에 int가 붙는 이유는 함수의 구조상 void는 반환값이 없고 int는 반환값이 있으며, 입력이 성공적으로 반환됐는지를 반환한다.

실패하거나 파일의 끝(EOF)에 도달하면 음수(EOF)를 반환한다.

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(){
    while(scanf("%d %d", &a, &b) != EOF){
        printf("%d",a/b);
    }
}

그래서 이와 같이 사용할 수 있다 이게 무슨 코드냐면 입력이 끝날 때까지 반복적으로 처리한다. 백준과 같은 문제해결 사이트 및 대회에서 두 수를 입력 받는데 몇번 입력 받는지도 안알려주고, 마지막에 0 0을 입력할 때에 끝난다라는 조건 등이 없는 문제, 즉 끝나는 기준이 없는 문제를 풀때에 이 코드를 사용할 수 있다. 또한 EOF는 음수이기에 -1을 써도 된다.


const char *format / 필수 인자 / %d %f %lf %Lf %e %c %s %x %o ...

입력 데이터의 형식 지정자(format specifier)를 포함하는 문자열으로 흔히 아는 그 %d, %f, %c형식이 맞다.

필수 인자로 지정한 그 %(type)형식으로 변수를 받게 된다.

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int n;
int main() {
	scanf("%c", &n);
	printf("%d", n);
}
// input: 1
//output: 49

따라서 scanf함수를 사용할때에 변수의 데이터 타입을 명확히 이해 및 올바른 형식 지정자 (format specifier)를 사용해야한다.


[argument]... / 가변 인자 /&variable

scanf함수를 사용하기 전에 미리 변수를 선언하는 이유는 그 변수의 시작 주소를 알기 위해서이다.

이 시작 주소를 통해 scanf는 입력값을 메모리에 저장할 위치를 결정하게 된다.

또한 미리 변수를 선언할때에 그 변수의 데이터 타입에 따라 변수의 메모리 크기와 scanf로 입력받을 데이터의 크기가 결정되는 것이다.

&로 참조된 이 주소들은 포멧 문자열의 각 형식 지정자에 매칭된다. 이 과정에서 입력값은 형식 지정자에 맞게 메모리에 저장되는 것이다.

'C study' 카테고리의 다른 글

C/C++) 파일 입출력 기초  (0) 2024.12.09
C/C++) Data Type 관련된 착각  (0) 2024.11.11