Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

나의 IT일지

입력함수 scanf 본문

프로그래밍 언어/C언어

입력함수 scanf

세레프 2023. 2. 4. 05:06

 우리는 어떤 내용을 입력하면, 그 내용에 대한 결과가 나오는 시뮬레이터를 많이 봤을 것이다. 그렇다면 입력한 내용들은 어떻게 저장이 되는 것일까?

입력함수 scanf

 우리가 키보드로 내용을 입력하면, 그 내용는 컴퓨터가 문자로 인식힌다. 하지만 그 입력한 내용을 사용하기 위해서는 그에 맞는 형식으로 바꿔줘야 하는데, 이 역할을 하는 것이 입력함수이다. 입력함수 중에는 "scanf"가 주로 사용되는데, scanf의 형식은 다음과 같다.

scanf("자릿수 형식지정자",&변수명);

 입력함수"scanf"의 뜻은 입력한 내용을 형식지정자의 형식에 맞춰서 변수에 저장하라는 함수이다. 위의 형식을 보면, 출력함수 "printf"의 형식지정 출력형식과 유사하며, 입력함수를 통해 저장한 값은 "printf"의 형식지정 출력형식을 통해 출력하게 된다. 

  scanf 함수를 사용할 때 유의해야 할 점이 있다. 

  1. scanf 함수에서 변수명을 지정할 때, "&"를 붙여야 한다. 
  2. 실수형인 데이터를 저장할 때, %f,%lf를 구분해야 한다.

 여기서 "&"는 메모리에 만들어진 변수의 주소로, 입력함수의 경우에는 해당 변수에 저장을 해야 하기 때문에, 다른 함수에서 사용하는 이름이 같은 변수와 구분하기 위해 사용해야 한다. 만약 변수명을 선언하면, 해당 변수의 위치를 모르기 때문에, 저장을 할 수 없다. 

 

 실수형 형식지정자에는 %f와%lf가 있으며, 출력의 경우에는 저장크기에 맞춰서 출력하기에 구분할 필요가 없지만, 입력의 경우에는 %f,%lf의 저장크기이 다르기에, 저장되는 데이터의 양이 따라 구분을 해야 한다.

#include<stdio.h>

void main() {
	int int_a;

	printf("입력 정수:");
	scanf("%3d", &int_a); 
	printf("출력 정수:%d\n", int_a);

}

 위의 소스코드는 입력한 정수를 출력하는 코드이다. 이때 Visual Studio에서는 이 코드를 실행을 할려고 하면, scanf함수가 안전하지 않아 scanf_s함수로 바꿔서 사용하라는 오류가 나온다.

 

 그렇다면 scanf함수는 안전하지 않는 이유가 무엇일까? scanf함수는 변수에 데이터를 저장할 때, 데이터량을 정하지 않는다. 그래서 용량 높은 데이터량을 입력하면, 할당받지 못하는 데이터가 존재하게 된다. 이는 다른 변수의 공간을 침범할 수 있기 때문에, 사용하지 않는것이다.

 

 scanf_s함수는 scanf함수와 비슷하게 생겼지만,  sizeof(자료형or배열)을 통해 저장크기을 정한다.

scanf_s("자릿수 형식지정자",&변수명,sizeof(자료형or배열));

그런데 scanf_s를 사용하지 않는 컴파일러이 있어서 호환성에 문제가 있을 수 있다. 그래서 scanf함수를 사용해야 되는 경우가 생기는데, 이는 프로젝트의 속성에서 SDL검사를 '아니요'로 바꾸면 사용할 수 있다.

 결과를 보면 입력한 정수가 "3333" 이지만, 출력값은 "333"인것을 확인 할 수 있다. 이것은 자릿값를 3으로 고정했기 때문이다. 

 

 입력함수도 형식지정자를 여러개로 해서 입력하는 방식이 있다.

scanf("자릿수 형식지정자1 자릿수 형식지정자2...",&변수명1,&변수명2);

 이때 형식지정자를 구분하는 방법은 띄어씌기(공백)으로만 구분이 가능하다.

#include<stdio.h>

void main() {
	int aa, bb;
	printf("입력:");
	scanf("%d %d", &aa, &bb);
	printf("aa=%d\nbb=%d", aa, bb);
}

 위의 소스코드 6번째 줄을 보면 형식지정자와 변수의 갯수가 같으며, 첫번째"%d"는 변수 aa를, 두번째"%d"는 변수 bb를, 대입힌다는 것을 알 수 있다.

 결과창에 값을 대입할 때, 두 개의 형식지정자를 구분했던 것처럼, 띄어쓰기로 대입할 값을 구분해야 한다.

 

'프로그래밍 언어 > C언어' 카테고리의 다른 글

연산자(산술, 대입, 증감, 비교, 논리)  (0) 2023.02.06
기타 입출력함수  (0) 2023.02.05
출력함수 printf  (0) 2023.02.03
상수와 키워드  (0) 2023.02.02
변수와 자료형  (0) 2023.02.01
Comments