#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;
}

기존에 만든거에서 업데이트했음.
read() 대신에 fread() 사용했음. 그래서 아마 MS윈도에서도 잘 될 것으로 보임.
realloc() 를 이용하여 입력이 늘어나면 버퍼 크기도 그에 따라 늘림. 가변 문자 배열임.
CTRL+D 누르는 상황을 대비하여 feof() 로 체크함.
buf[i] == 10 에서 10은 아스키문자를 십진수로 나타낸 것. LF(line feed)가 10 에 해당함.
scanf 대신에 유용하게 사용할 수 있음.
이 소스코드에 대하여 저작권을 포기하여 퍼블릭 도메인이며 저작권이 없으며 라이선스가 없습니다.