C 언어

Mon, Nov 16 2020 08:05:02
#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 대신에 유용하게 사용할 수 있음.