이 포스팅에서는 C의 표준 입력함수에 대해 알아본다.

 

입력 ( input) 이라는 말을 참 많이 들어봤을 것이다. 프로그램에서 입력이란 데이터를 넣는 것을 말한다.

 

input 은 다양한 형태로 존재한다. 데이터를 저장할 수 있는 것은 모두 input 이 될 수 있다.

 

파일,음성,그래픽 데이터 등 이다. 

 

C는 모든 장치를 파일로써 관리한다. 그래서 입출력이 필요할 때 파일을 연다. 이때 파일 포인터가 사용된다.

 

가장 기본이 되는 입력은 키보드이다. C에서는 입력과 출력을 관리하도록 내장함수를 가지고 있다.

 

getchar 와 putchar 함수

getchar 는 한글자를 읽고 putchar는 한글자를 쓴다.

 

#include <stdio.h>

int main()
{
    int ch;

    printf("Enter a value : ");
    ch = getchar();

    printf("\nYou entered : ");
    putchar(ch);

    return 0;
}

두글자를 입력해도 한글자를 입력받는다. 숫자도 아스키 문자로 저장한다.

 

 

getchar의 경우 연달아서 사용하면 기존의 버퍼를 읽어버린다. 이럴때 rewind 함수를 사용하면 표준입력에 저장된 버퍼를 비운다. stdin은 표준 입력 파일 포인터이다. 키보드 장치와 연결되어 있다. 즉 키보드를 입력하면 입력버퍼에 저장이 되고 getchar는 그중 포인터가 가리키는 하나의 값을 가져온다. rewind 함수는 연속해서 입력을 받아야 할 때 사용한다.

rewind(stdin);

 

버퍼의 예제는 아래와 같다.

 

#include <stdio.h>

void main(){
    int data;
    data = getchar();
    printf("First Buffer %c\n",data);
    getchar();
    data = getchar();
    printf("Second Buffer %c\n",data);
    printf("Second Buffer %c\n",data);

    // rewind(stdin);

}

rewind 함수를 가운데 getchar()를 빼고 넣는다. 아래 첫번째 실행에서는 두번째 getchar()가 버퍼에 있는 문자 b를 읽고 세번째는 c를 읽어 버렸다. getchar 가 실행되면 한글자씩 읽고 버퍼는 다음 저장된 문자로 포인터를 이동시킨다.

 

 

getc 와 putc 함수

getchar 함수는 사실 getc 함수로 만들어진 함수였다. 문자를 읽기 위해서 getc함수는 매개변수에 표준 입력 포인터를 넘겨줘야 작동한다. putc 더 마찬가지로 출력 포인터를 넘겨준다.

 

stdin, stdout 이것이 입력과 출력장치를 가리키는 포인터이다. stdio.h 에서 include 포함한다는 말은 지금까지 이 기능들과 연관있었던 것이다. std => Standard, io => Input and Output 합쳐서 stdio -> Standard Input and Output 표준입출력이다.

#include <stdio.h>

int main()
{
    int ch;

    printf("Enter a character : ");
    ch = getc(stdin);

    int i;

    putc(ch,stdout);

    return 0;
}

 

getc putc

 

gets 와 puts 함수

gets와 puts 함수로 문자열을 입출력할 수 있다. 예제를 보자.

 

#include <stdio.h>

int main()
{
    char str1[100];
    printf("Enter a text line : ");
    gets(str1);
    printf("\nEntered text : \n");
    puts(str1);
    printf("%s" , str1);

    return 0;
}

gets 는 표준입력에서 한줄을 읽어와 버퍼에 입력한다.  puts는 버퍼에 입력된 한줄을 개행 문자까지 출력한다.(NULL문자라고 한다) 엔터키를 치면 개행문자 0이 끝에 저장된다. 물론 0은 표준출력에 표시할 필요가 없다. 내부적으로 문장이 끝났는지(입력이 종료했는지) 확인하기 위해 저장되는 문자이다.

 

C언어의 문자는 아스키 코드로 저장됨을 잊지 말아야 한다. int형을 사용할 수 있는 것은 출력시 아스키 코드에 대응 시키기 때문이다.

 

*아스키코드 포스팅

 

C언어 2 - 2 | 자료형 | 아스키코드

C언어에 대한 내용을 다룰 때 아스키 코드에 대한 이야기를 하려고 생각하고 있었다. 다행히 요즘은 인터넷에 아스키 코드에 관해서는 쉬운 설명도 많이 있고 한글 자료도 많다. 아스키코드는 ��

digiconfactory.tistory.com

 

 

Visual Studio 의 C 컴파일러는 gets 함수가 deprecated( 사용중지됨) 되었을 것이다.

 

이런 경우 fgets를 사용한다.

 

#include <stdio.h>

int main()
{
    char str1[50];

    printf("Enter a text line : ");
    fgets(str1,5,stdin);

    printf("\nEntered text : \n");
    puts(str1);


    return 0;
}

원래 fgets는 파일의 데이터를 읽어오는 함수이다. fgets의 매개변수를 보면 표준입력장치 stdin 로 지정하면 입력버퍼에서 문자열을 받아올 수 있다.

 

scanf 와 printf 함수

C언어의 입문 단계에 Hello World 부터 함께해온 printf 와 그 커플인 scanf 함수이다.

 

f가 의미하는 것은 format 이다. java나 다른 언어에도 아직도 이 printf의 포맷이 남아있을 정도로 범용적인 문자열 포맷이다.

 

문자열 포맷이 중요한 이유는 가장 많이 다루어야 하기 때문이다. 프로그램의 사용자는 서버나 다른 네트워크 컴퓨터가 될 수도 있지만 결국 인간이 가장 많이 사용한다. 사용하는 인간들이 많다 보니 처리해야 할 텍스트의 양이 적지가 않다. 포맷화된 표준 입력과 출력을 제공함으로써 단순히 텍스트 출력에 그치지 않고 다양한 정보를 가공할 수 있다.

 

scanf 함수는 표준입력으로부투 입력된 데이터를 읽어온다. 그리고 그 내용을 포맷에 따라 스캔하여 변수에 저장한다. getc나 gets 와 다른 점은 문자, 문자열, 정수형 실수형 등 다양한 포맷을 지정할 수 있다.

 

printf 함수는 표준출력에 데이터를 쓴다. 제공된 포맷에 따라 텍스트를 생산한다. 

 

자주 사용되는 포맷 지정자는 아래와 같다

format

 description

 %s

 문자열 ('\0'를 만날 때까지 출력)

 %c

 문자 한개

 %d

 +/-  부호 있는 정수형

 %x

 정수를 16진수 소문자로

 %X

 정수를 16진수 소문자로

 %ld

 long 형 

 %f

 실수형 

 %u

 부호없는 정수

%p

메모리 주소값 형식(포인터)

 

아래는 간단한 예제이다.

 

scanf 의 %s지정자의 경우 gets와는 다르게 공백문자를 만나면 종료한다. 비주얼 스튜디오로 작동시키면 역시 deprecated 되었기 때문에 사용할 수 없을 것 이다. 그도 그럴것이  C++ 의 iostream을 쓰는 것을 권장하고 있다. 비주얼 스튜디오로 C의 빈프로젝트를 만들면 기본은 iostream 으로 만들어 준다.

 

너무 오래되었다니... 이해는 간다. 70년대 언어니까 이게 거의 반백년 동안 사용되었을 것이니까.

 

아래 예제는 gcc 컴파일러로 작성했다.

#include <stdio.h>

int main() {

    char str[100];
    int i;

    printf("Enter a value : \n");
    printf("1. Insert String and Enter  \n");
    scanf("%s", str);
    printf("2. Insert a number and enter : \n");
    scanf("%d", &i);

    printf("\nYou entered: %s %d ", str, i);

    return 0;
}

 

공유하기

facebook twitter kakaoTalk kakaostory naver band