#include <stdio.h>
#include <stdlib.h>
/*
* 컴파일 방법
* cc -o exam exam.c
* scanf 사용할 때 오퍼플로우 문제 때문에 scanf 를 쓰지 말라고 권고하는 추세임.
* fread() 함수를 이용하여 stdin 으로부터 1문자씩 읽어서 realloc 로 가변 문자열을 만드는 방법임
*/
char *get_line_from_stdin ()
{
char *buf = malloc (sizeof (char));
int i = 0;
fflush (stdout);
fflush (stderr);
while (fread (buf + i, sizeof (char), 1, stdin) == sizeof (char))
{
if (buf[i] == 10 || feof (stdin)) /* LF or CTRL+D */
break;
i = i + sizeof (char);
buf = realloc (buf, sizeof (char) + i);
}
buf[i] = 0; /* null-terminated string */
return buf;
}
int main (int argc, char **argv)
{
char *str;
printf ("type: ");
str = get_line_from_stdin ();
printf ("%s\n", str);
free (str);
return 0;
}
realloc
을 이용하여 입력이 늘어나면 버퍼 크기도 그에 따라 늘림. 가변 문자 배열임.
CTRL+D 누르는 상황을 대비하여 feof()
로 체크함.
buf[i] == 10 에서 10은 아스키문자를 십진수로 나타낸 것. LF(line feed)가 10 에 해당함.
scanf
대신에 유용하게 사용할 수 있음.