언어/C,C++

C language Chapter 4. C언어의 입출력

깜냥c 2020. 3. 17. 12:30

안녕하세요

 

저번에는 C언어의 변수와 자료형에 대해서 배웠습니다.

 

이번 글은 기본적인 C언어의 입출력에 관해서 알아보도록 하겠습니다

 


 

C언어에서 입출력 할 때는 입출력 함수를 이용합니다.

 

주로 printf, scanf(scanf_s)를 쓰며 getc, puts과 같은 함수도 쓰입니다.

 

먼저 출력 함수에 대해서 알아보겠습니다.

 

1. Printf

 

printf는 문장 혹은 변수 값을 출력할 수 있습니다.

 

printf의 정의는 다음과 같습니다.

 

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

 

format - 문자, 형식 지정자, 이스케이프 시퀀스 등을 작성

 

argument - 인수

 

문장을 출력할 경우 printf("내용"); 과 같이 쓰면 됩니다.

 

만약 a라는 정수형 변수를 출력하고 싶으시면 printf("%d", a) 같이 쓰면 됩니다.

 

여기서 변수를 출력할 때는 '%d'와 같이 어떤 변수를 출력할 것인지 컴퓨터에게 알려주어야 하는데 이것을 형식 지정자라고 합니다.

 

형식 지정자는 C language Chapter 3. C언어의 변수와 자료형 에서 표로 정리했었습니다.

 

표에 나오지 않은 형식 지정자 중에 %s와 같은 문자열 형식과 %x와 같은 16진수 형식도 있습니다.

 

2. scanf(scanf_s)

 

scanf는 사용자로부터 값을 입력 받을 수 있습니다.

 

scanf의 정의는 다음과 같습니다.

 

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

 

format - 형식 지정자 작성

 

argument - 인수

 

변수를 받을 경우 scanf("%d",&a); 같이 쓰면 됩니다.

 

문장을 입력 받을 경우에는 char b[15]; 같이 배열을 이용해 문자열을 만들고 scanf("%s",b); 이렇게 쓰면 됩니다.

 

배열에 관해서는 추후에 다루도록 하겠습니다.

 

*scanf 오류와 scanf_s

 

Visual Studio에서 scanf를 쓰게 되면 다음과 같은 오류가 뜹니다.

 

 

 

 

C4996 오류는 더 이상 사용되지 않는, 안전하지 아니한 함수를 사용할 경우 나타납니다.

 

이러한 경우 다른 함수로 대체해서 쓰는 것이 좋겠지만, 경고를 무시하고 사용할 수도 있습니다.

 

사진에 보이는 것처럼 _CRT_SECURE_NO_WARNINGS을 사용하는 방법이 있습니다

 

방법은 int main() 부분 전에 #define _CRT__SECURE_NO_WARNINGS을 적으시면 됩니다.

 

#include <stdio.h>
#define _CRT__SECURE_NO_WARNINGS

int main()
{
	//
}

 

혹은 소스파일의 [속성]-[구성 속성]-[C/C++]-[전처리기]-전처리기 정의 에다가 한 칸 띄고  _CRT__SECURE_NO_WARNINGS을 적으시면 됩니다.

 

 

 

 

이 방법 외에 scanf_s라는 함수를 대신 사용하여 해결할 수도 있습니다.

 

scanf_s는 scanf와 유사한데 버퍼의 크기를 인수로 넣어줘야 한다는 차이점이 있습니다.

 

scanf("%s",b); --> scanf_s("%s",b,30); 간단하게 표현하면 이렇게 쓸 수 있습니다.

 

쉽게 말해 문자열의 길이를 제한해줘야 한다는 것입니다.

 

이렇게 하는 이유는 버퍼 오버런, 버퍼 오버플로우를 예방하기 위해 이렇게 쓰는 것입니다.

 

버퍼 오버플로우란 데이터를 저장할 때 내가 지정한 버퍼 바깥 쪽에 저장되는 것을 의미하며 이로 인해 잘못된 동작이 야기됩니다.

 

자세한 내용을 링크를 참조해주세요


이상으로 글을 마치겠습니다.

 

잘못된 부분이 있으면 알려주시면 감사하겠습니다

 

 

출처

더보기