printf함수와 scanf함수 이외에도 문자열 입출력 함수들이 있습니다. 특히 scanf함수는 띄어쓰기를 포함하는 문자열을 표현하지 못했는데 이제는 공백까지도 표현할 수 있는 문자열 입력함수도 알아보겠습니다.

 

1. 문자열 출력 함수


int puts(const char * str); // 문자열의 주소값을 전달인자로 받아  표준 출력 스트림을 통해 전송
int fputs(const char * str, FILE * stream); // 문자열의 주소값을 전달인자로 받아 지정된 출력 스트림을 통해 전송

**
위의 두 함수는 호출을 성공하면 양수를, 실패하면 EOF == -1 을 반환합니다.**

puts함수와 fputs함수에는 출력스트림 지정 이외에도 하나의 차이점이 또 있습니다. puts함수는 출력을 한 이후 자동으로 줄이 바뀌지만 fputs함수는 자동으로 줄을 바꿔주지 않아 '\n'을 사용해 직접 줄을 바꿔주어야 합니다.

 

 

2. 문자열 입력 함수


char * gets(char * str); // 문자열을 표준 입력 스트림을 통해 전달받아 str에 저장
char * fgets(char * str, int n, FILE * stream); // 문자열을 지정된 입력 스트림을 통해 전달받아 str에 저장. 입력받는 문자열의 길이도 포함해야 함

위의 두 함수는 호출을 실패하거나 파일의 끝에 도달하여 더 이상 읽어들일 값이 없을시에 널 포인터(null pointer)를 반환합니다. 그래서 반환형이 포인터형 변수로 선언이 된 것입니다. 널 포인터란 말 그대로 포인터가 없다는 뜻입니다. 가르키는 곳이 없다는 것은 호출이 실패하거나 더 이상 읽어들일 주소값이 없는 경우 입니다.

fgets 함수는 gets함수와는 다른 두드러지는 특징이 두 개 있습니다.

1) 입력받을 문자열의 길이를 지정해야 합니다.

이 특징은 설정한 길이보다 많은 문자열을 입력하더라도 알아서 걸러내기 때문에 메모리공간을 넘어서 침범하는 것을 방지할 수 있습니다.

 

2) 엔터 키('\n')까지도 하나의 문자로 읽어들입니다.

fgets 함수는 scanf함수와 다르게 개행('\n')을 기준으로 문자열을 인식하는데, 이 때 개행('\n')까지도 문자로 인식하여 입력으로 받아들입니다. 따라서 굳이 따로 개행을 넣어 줄 필요가 없습니다.

#include <stdio.h>

int main(void)
{
    char str[10];
    fgets(str, sizeof(str)/sizeof(char), stdin);
    printf("%s\n", str);

    return 0;
    }

실행결과1

Hello

Hello //출력 후 문자로 입력된 '\n'에 의한 첫 번째 개행 - fgets함수가 '\n'도 하나의 문자로 읽어들이기 때문

//printf함수에 삽인된 '\n'에 의한 두 번째 개행

계속하려면 아무 키나 누르십시오 . . .

실행결과2

abcdefghijklmnopqrstu

abcdefghi

계속하려면 아무 키나 누르십시오 . . .

fgets 함수의 특징으로 인해 NULL문자를 포함하여 총 10개의 문자만 출력이 되었습니다.

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

(C언어) 37 - 버퍼(Buffer)  (0) 2020.05.14
(C언어) 36 - string  (0) 2020.05.14
(C언어) 34 - 문자 입출력 함수들  (0) 2020.05.14
(C언어) 33 - 스트림  (0) 2020.05.14
(C언어) 32 - 메모리  (0) 2020.05.14

+ Recent posts