String의 입/출력과 관련한 string.h 파일의 표준함수들을 사용해 보고 문제점을 파악해 보자.
#include <stdio.h>
#include <string.h>
int main()
{
char str1[10], str2[10];
// 방법 1 (stdio.h -> printf)
printf("이상원\nLee Sang Won\nLSW\n\n");
//방법 2 (string.h -> fgets, fputs, puts for string arr "str")
puts("Enter your name! : "); // 개행o
fgets(str1, sizeof str1, stdin);
fgets(str2, sizeof str2, stdin); // 에러 발생
fputs(str1, stdout); // 개행x
return 0;
}
Enter your name! 후 "\n" 없이 자동 개행되는 모습이 보기 좋지 않다. 이는 puts의 자동개행 기능 때문.
fgets → 이름입력 후 연속적인 fgets의 인자(str2) 입력이 불가능하다.(fgets 연달아 사용시 문제가 발생) 이는 stdin공간에 이전 값이 잔존해 있기 때문이다.
main function
void Erasestring(char str[]); // stdin에 저장된 이전값을 제거하는(불러들이는) 함수 선언
int main()
{
char str1[10], str2[10];
// 방법 1 (stdio.h -> printf)
printf("이상원\nLee Sang Won\nLSW\n\n");
//방법 2 (string.h -> fgets, fputs, puts for string arr "str")
fputs("Enter str1 name! : ", stdout); // puts대신 fputs
fgets(str1, sizeof str1, stdin);
Erasestring(str1); // stdin에 잔존해 있는 쓰레기값 제거
fputs("Enter str2 name! : ", stdout);
fgets(str2, sizeof str2, stdin);
fputs(str1,stdout);
fputs(str2,stdout);
return 0;
}
Code explanation
주석에 상당부분 설명이 돼 있어 간략히 설명하자면
Erasestring function
void Erasestring(char str[])
{
while(getchar() != '\n');
/* 문자열로 인식되기 위해선 '\n'가 말미에 붙어있어야하며 다루고 있는 string.h 파일의
표준함수들은 모두 문자열을 위한 것임으로.. fgets()로 받아들인 string 역시 말미에 '\n'가
붙어 임시공간에 머물게 된다. 따라서 '\n'전까지의 내용을 불러들여 공간을 비우면 동일한 공간
을 재사용할 수 있게 되는 것이다.
*/
}
아직 string 헤더파일 표준함수 사용의 필요성을 절감하지는 못하겠다. 하지만 미리 익혀둔다면 나쁠게 없다.