POST

C언어 스트림(stream)의 활용 - 문자열 단위 입출력 함수

문자열 단위 입출력 함수


모니터로 문자열을 출력할때 아래와 같은 두개의 함수가 쓰인다.

puts

fputs


첫번째것은 출력 스트림이 stdout으로 지정되어 있다.

두번째는 출력 스트림을 선택할 수 있다.(모니터, 파일 등)


사용법은 아래와 같다.

#include<stdio.h>


int main(void) {

char *str = "Simple String";


printf("1. puts Test ------\n");

puts(str);

puts("So Simple String");


printf("2. fputs Test -----\n");

fputs(str, stdout); printf("\n");

fputs("So Simple String", stdout); printf("\n");


printf("3. end of main ----\n");

return 0;

}


※사용법은 위와 같으며 주목할 점은 puts는 자동으로 개행이 이루어 졌으며 fputs는 자동으로 개행이 이루어 지지 않았다.는 것이다.



키보드로부터 문자열을 입력 받을때는 아래와 같이 두개의 함수가 쓰인다.

gets

fgets

첫번째것은 출력 스트림이 stdin으로 지정되어 있다.

두번째는 출력 스트림을 선택할 수 있다.(모니터, 파일 등)


그리고 scanf함수와의 차이점은 scanf는 공백을 포함하는 문자열에는 제한이 있지만, 이것들은 공백이 포함이 되더라도 제한이 없다.


gets의 사용 방법은 아래와 같다.

int main(void) {

char str[7];

gets(str);

. . .

}

※문장 구성은 확실히 간단하지만, 미리 마련해 놓은 배열을 넘어서는 길이의 문자열이 입력되면, 할당 받지 않은 메모리 공간을 침범하여 실행 중 오류가 발생한다는 단점이 있다.

그래서 가급적이면 fgets함수를 호출하여 사용하는 것이 좋다.


fgets의 사용방법은 아래와 같다.

int main(void) {

char str[7];

fgets(str,sizeof(str),stdin);

. . .

}

위의 fgets함수를 해석 하자면 " stdin으로부터 문자열을 입력받아서 str에 저장하되 sizeof(str)의 길이 만큼만 저장해라 "라고 할 수 있다.

ex ) 입력: 123456789

 저장: 123456

숫자 6개가 저장되는 이유는 문자열의 끝을 알리는 NULL문자가 마지막에 저장되기 때문이다.

NULL문자는 문자열의 사용에 필수이며 알고 있어야 한다.


아래의 예제를 따라 해보자.

#include<stdio.h>


int main(void) {

char str[7];

int i;


for (i = 0; i < 3; i++) {

fgets(str, sizeof(str), stdin);

printf("Read %d: %s\n", i + 1, str);

}

return 0;

}


12345678901234567890을 입력했을때 위의 결과 처럼 나타나는가?

사용자는 한번만 입력 했을 뿐이지만 자동으로 fgets함수를 세번 호출을 한다.


자, 그러면 문자열의 길이를 5로 제한해서 아래의 스크린샷 처럼 입력하여 보자.




분명히 개행을 의미하는 \n이 하나만 삽입이 되어 있는데 결과에서 보는 것처럼 두번의 개행이 이루어 졌음을 알 수 있다.


개행이 두번 이루어진 이유는 엔터를 치면 \n이 입력이 되는데, 이것을 버리지 않고 문자열의 일부로 받아 들이기 때문이다.

또한 fgets함수는 \n를 만날때까지 문자열을 읽어들이기에 공백이 삽입 되더라도 공백자체를 문자열로 읽어 들인다.