C언어 기본 입출력
입력(Input)은 필요한 데이터를 프로그램에 제공하는 것이고 출력(Output)은 프로그램에서 데이터를 화면, 프린터 그리고 파일로 출력하는 것입니다. 입출력은 C가 제공하는 내장 입출력 함수로 헤더 파일 선언 후 사용 가능합니다.
기본 조건
입출력관련 함수를 사용하기 위해서는 전처리기로 헤더파일을 선언해야 합니다. 프로그램 제일 상단에 #include <stdio.h>를 넣습니다.
헤더 파일은 .h로 끝나는 파일이며 내장 함수에 따라 필요한 헤더 파일을 선언해야 합니다. (stdio.h, math.h, string.h 등등)
scanf() / printf() 함수
stdio.h에 선언된 기본 입출력 함수.
scanf()는 사용자의 입력을 받고 printf()는 화면에 출력합니다.
#include<stdio.h>
void main()
{
// 변수 선언과 정의
int i;
/*
화면에 값을 입력하라는 메시지를 출력
*/
printf("Please enter a value...");
/*
사용자가 입력한 값을 읽음
*/
scanf("%d", &i);
/*
입력한 값을
*/
printf( "\nYou entered: %d", i);
}
위의 프로그램을 실행하면 값을 입력하라는 메시지가 출력되고 값을 입력하면 입력한 값이 화면에 출력됩니다.\
scanf()와 printf() 함수는 특수문자(%d)를 사용하여 입출력하는데요. 이것을 서식 지정자, 포맷 지정자 혹은 포맷 스트링(Format String)이라고 합니다.
포맷 스트링(Format string)
포맷 스트링은 데이터 타입(Dataytype)에 따라 다릅니다.
%s의 경우 입력은 공백(whitespace)에서 끝납니다. 또한 포맷 스트링에 숫자를 넣음으로써 입출력할 수 있는 자릿수나 문자수를 제한할 수 있습니다.
“%1d”는 입력한 숫자 중 첫 자릿수의 값만 입력받고 “%3s”는 세 개의 문자만 입출력으로 받습니다.
아래 예제에서 입력을 51로 했어도 실제로 입력받는 값은 5입니다.
scanf("%1d", &i);
C언어에서 출력이란 "파일에 쓴다(Write)"라고 표현합니다.
여기서 파일이란 모니터, 프린터 등 모든 출력 장치들을 말합니다. 즉, C는 모든 출력 장치를 파일로 다루며 그곳에 데이터를 씀으로써 출력하는 것입니다.
마지막으로 printf()와 scanf() 함수의 리턴 값은 입출력된 문자수입니다.
int i = printf("studytonight");
i에는 printf가 리턴한 12가 저장됩니다.
getchar() / putchar() 함수
getchar()와 putchar() 함수는 한 번에 하나의 문자만 입력되고 출력됩니다.
getchar()의 리턴값은 입력된 문자의 정수 값을 리턴하고 putchar() 함수는 출력합니다.
#include <stdio.h>
void main( )
{
int c;
printf("Enter a character");
/*
입력된 문자가 c에 저장
*/
c = getchar();
/*
c에 저장된 문자를 출력
*/
putchar(c);
}
C에서의 모든 문자는 ASCII 코드의 정수 값으로 대응합니다.
다음 링크에서 “sizeof(‘a’)의 크기가 4바이트 이유?” 항목에서 힌트를 얻을 수 있습니다.
gets() / puts() 함수
gets() 함수는 공식적으로 2011년 C 표준에서 공식적으로 삭제되었습니다. 컴파일러에 따라 아직도 사용이 가능하나 사용을 안 하는 것을 권합니다. 그 이유는 오버플로우(overflow) 에러에 취약하기 때문입니다.
함수 자체 내에서 입력 크기를 제한할 수 있는 방법이 없습니다. 일종의 버그인데요. 사용자가 입력하는 대로 무한대로 입력받습니다. gets() 함수 대신 fgets() 함수를 사용하면 됩니다.
puts() 함수는 표준 출력(stdout)으로 입력된 문자열과 엔터(newline)를 함께 출력합니다.
일반적으로 표준 입력(stdin)은 키보드, 표준 출력(stdout)은 모니터입니다. 표준 입출력(stdin/stdout)은 설정에 따라 달라질 수 있고 언제나 변경 가능합니다.
쉽게 키보드로 입력을 받고 모니터로 출력한다라고 생각하시면 됩니다.
#include<stdio.h>
void main()
{
/* 크기가 100인 문자 배열(Array) */
char str[100];
printf("Enter a string\n");
/* gets( str ); -> warning:the `gets' function is dangerous and should not be used. */
/* gets 대신 fgets을 사용 */
fgets(str, sizeof(str), stdin);
puts( str );
}
위 예제는 fgets() 함수로 입력을 받고 puts() 함수로 출력을 합니다. fgets() 함수는 저장받을 공간(str), 크기(sizeof) 그리고 표준 입력(stdin)을 인자 값으로 정의합니다.
여기선 주목할 점은 문자열뿐만 아니라 엔터 값(newline)까지 값이 출력된다는 것입니다.
scanf()와 gets()의 차이점
가장 큰 차이점은 scanf()는 공백 문자를 만나면 입력이 끝나지만 gets()는 공백 문자까지 입력을 받습니다. 만약 “Hello World”를 입력했다면 scanf()는 “Hello”만을 gets()는 “Hello World” 전부를 입력으로 받습니다.
<< 다음 | 혼자 공부하는 C언어 | 이전 >> |
'프로그래밍 > C' 카테고리의 다른 글
이중 for문을 사용하여 역순으로 출력하기 예제 (0) | 2019.09.19 |
---|---|
C언어 sizeof(‘a’) 크기가 4바이트 이유 (0) | 2019.09.14 |
C언어 개발된 이유 (feat. B언어 문제점) (0) | 2019.09.13 |
C언어 메모리 주소의 또 다른 이름 변수 (0) | 2019.09.11 |
C언어 데이터 타입 (Data Types) (0) | 2019.09.11 |