본문 바로가기

C언어

19. 문자열 단위 입 · 출력 함수

1) 문자열 출력 함수


#include <stdio.h>

int puts(const char* s);
int fputs(const char* s, FILE* stream);


puts 함수는 문자열을 표준 출력 스트림(stdout)으로 출력하기 위해 사용하는 함수이다. 인자로 전달되는 포인터는 문자열을 가리키고 있어야 한다.
fputs 함수는 문자열을 출력할 스트림을 선택할 수 있다는 것을 제외하면, puts 함수와 동일한 기능을 지니는 함수이다. 단 한가지 차이점을 더 지닌다.
puts 함수는 문자열을 출력한 다음에 자동으로 줄을 바꿔 주지만, fputs 함수는 자동으로 줄을 바꿔주지 않는다. 다음 예제의 출력 결과를 통해서 차이점을 확인해 보자


#include 

int main(){
	fputs("fputs 함수에 의한 출력, ", stdout);
	fputs("I Love Linux ", stdout);

	fputs("\n", stdout); // 한 줄 건너 뛰기 위해서.

	puts("puts 함수에 의한 출력, ");
	puts("I Love Linux ");

	return 0;
}

4, 5번 줄에 있는 stdout은 첫 번째 인자로 전달된 문자열을 표준 출력 스트림(stdout)을 통해서 출력하라는 의미이다.

- 실행 결과

fputs 함수에 의한 출력, I Love Linux
puts 함수에 의한 출력,
I Love Linux
Press any key to continue

fputs 함수를 통해 출력을 하는 경우는 자동으로 줄이 바뀌지 않지만
puts 함수를 통해 출력을 하는 경우는 자동으로 줄이 바뀌었다.
이 점이 fputs와 puts의 차이점이다.

2) 문자열 입력 함수


#include <stdio.h>

char* gets(char* s);
char* fgets(char* s, int n, FILE* stream);


gets 함수는 문자열을 입력받는 함수이다. 우선 입력받을 문자열을 저장하기 위한 배열을 선언한 다음, 배열의 시작 주소(배열 이름이 배열의 시작 주소이다)를 인자로 전달하면서 gets 함수를 호출하게 되면, 표준 입력 스트림(키보드)으로 부터 데이터를 입력 받는다.

그러나 이 함수는 잠재적인 문제를 지니고 있다. 다음 예제를 통해 설명하겠음.


#include 

int main(){
	char str[10];
	gets(str);
	puts(str);

	return 0;
}


위 예제에서 입력값은 10자 이내로 입력하면 상관 없지만 10자이상 넘게 입력할시 Overflow가 발생되며 아래와 같은 에러가 생긴다.


다음 예제는 fgets 함수의 사용예이다.


#include 

int main(){
	char str[10];

	fputs("문자열을 입력 하세요 : ", stdout);
	fgets(str, sizeof(str), stdin);

	fputs("입력된 문자열 : ", stdout);
	fputs(str, stdout);

	return 0;
} 


2가지 실행 결과로 차이점 살펴보자

- 실행 결과 1

문자열을 입력하세요 : good!
입력된 문자열 : good!

10자 이내로 입력했기 때문에 아무런 문제없이 출력 되었다. gets 함수를 사용해도 큰 문제가 되지 않는다.

- 실행 결과 2

문자열을 입력하세요 : 1234567890123456789
입력된 문자열 : 123456789
두 번째 실행 결과는 문자열을 저장하기 위해 미리 할당해 놓은 배열의 길이보다 긴 길이의 문자열이 입력되었을 경우의 실행 결과를 보여준다.
gets 함수와 달리 에러 메시지를 띄우고 강제종료 되지 않지만

배열이 할당해 놓은 길이 만큼만 입력받고 있다. 한 가지 주의할 점은 배열의 길이가 10임에도 불구하고 총 9개의 문자가 출력 되었다.

그이유는 끝에 반드시 NULL 문자가 들어가야 하기 때문이다.

'C언어' 카테고리의 다른 글

21. 문자열 조작 함수 - strlen  (0) 2011.01.02
20. 표준 입 · 출력과 버퍼(Buffer)  (1) 2011.01.02
18. 문자 입 · 출력 함수  (0) 2010.12.31
17. 스트림과 데이터의 전송  (0) 2010.12.31
16. 함수포인터  (0) 2010.12.31