-
문자열 입력 함수에 대한 고찰backup/c,c++ 2009. 12. 29. 22:07
1. 입력함수(gets, fgets, scanf) 종류
char* gets(char* s)
char* fgets(char * s, int n, FIILE* stream)
int scanf(const char* format, ...)
2. 입력함수의 차이
문자열 입력함수는 위의 세가지가 있다.(내가 모르는 함수가 있을수도...)
이 함수들의 차이는 입력시 엔터 즉, \n의 처리에 있다.
gets는 알다시피 표준입력(stdin)에 대해서만 사용한다. 그래서인지 입력시 \n를 문자열의 끝으로 인식하고
읽어드리지만 않을 뿐더러 버퍼에 남겨두지도 않는다. 만일 입력시 버퍼에 \n가 남아 있는 경우에는 입력의
기회를 박탈 당한다. 왜냐 \n를 문자열의 끝으로 인식한다고 했기 때문이다. 따라서 입력기회만 없어지고
아무것도 입력받지 않은 것처럼 된다.
fgets는 필요에 따라서 입력 버퍼를 지정할 수 있다.(간단하게 표준입력과 파일입력...) 파일에서 입력받을 경우를
생각해 정확하게 처리하기 위해서인지 입력시 \n가 있으면 이 또한 받아드린다. 단, 조건이 있다.
입력 문자열 길이가 지정한 길이보다 2이상 작을 경우에만 \n를 읽어온다. 왜냐, fgets는 미리문자열의 길이를
지정하는데 문자열이란 끝에 NULL이 포함 되어야 하므로 읽어오는 문자열은 지정한 길이보다 1이 작게 된다.
따라서 2이상 작아야 \n가 들어갈 공간이 있게 되는 것이다. 만일 \n가 들어갈 공간이 없을 경우에는 버퍼에
\n를 남겨놓는다.
입력전에 버퍼에 \n가 남아있다면 gets와 마찬가지로 입력의 기회를 박탈당하면서 \n을 읽어오기는 하지만
fgets는 \n를 문자열 끝으로 인식하지 않기때문에 출력시에는 \n만 출력을 한다.
scanf같은 경우는 \n를 제외한 나머지 문자열을 읽어드린다. 따라서 버퍼에 \n가 남아있게 되고
다음 입력함수에 따라 처리된다. 읽어오기 전 버퍼에 \n가 남아 있는 경우에는 위 두 함수와 다르게 \n를
무시해 버리고 입력기회도 박탈당하지 않는다.
3. 결론
결론적으로 위 3함수를 비교했을때는 scanf만 쓸 경우가 가장 편하고 신경쓸 것이 없다. 그러나 프로그램에서
중요한 속도 측면에서 보면 fgets나 gets가 더 빠르다. fgets와 gets도 분명 작지만 차이가 존재한다. 그러나 보통
overflow를 방지할 수 있는 fgets를 사용하는 것이 안전하다. 분명하게 overflow가 발생하지 않는 경우라면 gets는
유저 측면에서는 코딩이 가장 간편한 함수라 할 수 있다.
이처럼 세 함수 모두 각각 장점과 단점이 존재한다. 따라서 사용은 프로그래머의 몫이라 생각된다.