[C] 표준 입출력 함수

김태희·2025년 1월 30일
0

표준 입출력 함수

C 언어에서 표준 입출력 함수는 <stdio.h> 헤더 파일에 정의되어 있다.

이 함수들은 콘솔(터미널)을 통해 데이터를 입력받고 출력하는 데 사용된다.

더 배우다보니 버퍼오버플로우 취약점이 있다는점도 알게되었고, 버퍼를 통해 입력이 되기에 각종 입력 함수를 섞어 쓰면 예상과 다르게 프로그램이 돌아가게 되어서 fflush 함수 등을 통해 버퍼를 초기화해줘야하는 경우도 있었다.

이처럼 점점 아는게 많아질수록 헷갈리는게 많아졌고,scanf와 printf만 주구장창 써온 나에게는 puts와 gets 중 어떤게 입력인지 출력인지도 가끔 헷갈렸다.

또한
ch = getchar();
gets(str);
위 예제들처럼 비슷해보여도 사용법이 조금씩 다른 경우가 있어 헷갈리는 경우도 있었다.

앞으론 헷갈리지 않기위해 각 함수들의 차이를 한눈에 살펴볼 수 있도록 보기좋게 정리해보겠다.


출력 함수

출력함수는 printf()외에도 같은 p로 시작하는 putchar() puts() 가 있다.

입력 출력이 조금이라도 헷갈릴땐 출력함수들은 printf와 같은 p로 시작한다는 점을 항상 생각하였다.

printf()

  • 형식: int printf(const char *format, ...);
  • 기능: 형식화된 문자열을 표준 출력(콘솔)에 출력합니다.
  • 예시:
    int num = 10;
    printf("Number: %d\n", num); // 출력: Number: 10

putchar()

  • 형식: int putchar(int char);
  • 기능: 한 문자를 표준 출력에 출력합니다.
  • 예시:
    putchar('A'); // 출력: A

puts()

  • 형식: int puts(const char *str);
  • 기능: 문자열을 표준 출력에 출력하고 자동으로 줄 바꿈(\n)을 추가합니다.
  • 예시:
    puts("Hello, World!"); // 출력: Hello, World!\n

입력 함수

scanf()

  • 형식: int scanf(const char *format, ...);
  • 기능: 형식화된 입력을 표준 입력(키보드)에서 받아 변수에 저장합니다.
  • 예시:
    int num;
    scanf("%d", &num); // 사용자로부터 정수 입력 받기

getchar()

  • 형식: int getchar(void);
  • 기능: 표준 입력에서 한 문자를 읽어 반환합니다.
  • 예시:
    char ch = getchar(); // 사용자로부터 한 문자 입력 받기

gets()

  • 형식: char *gets(char *str);
  • 기능: 문자열을 표준 입력에서 읽어 str에 저장합니다. (보안 문제로 인해 사용을 권장하지 않음)
  • 예시:
    char str[100];
    gets(str); // 사용자로부터 문자열 입력 받기 (위험!)

fgets()

  • 형식: char *fgets(char *str, int n, FILE *stream);
  • 기능: stream에서 문자열을 읽어 str에 저장합니다. (stdin을 사용하면 표준 입력에서 읽음)
  • 예시:
    char str[100];
    fgets(str, 100, stdin); // 사용자로부터 문자열 입력 받기 (안전)

파일 입출력 함수

fprintf()

  • 형식: int fprintf(FILE *stream, const char *format, ...);
  • 기능: 형식화된 문자열을 파일에 출력합니다.
  • 예시:
    FILE *file = fopen("output.txt", "w");
    fprintf(file, "Hello, File!"); // 파일에 문자열 출력
    fclose(file);

fscanf()

  • 형식: int fscanf(FILE *stream, const char *format, ...);
  • 기능: 파일에서 형식화된 입력을 읽어 변수에 저장합니다.
  • 예시:
    FILE *file = fopen("input.txt", "r");
    int num;
    fscanf(file, "%d", &num); // 파일에서 정수 읽기
    fclose(file);

fputc()

  • 형식: int fputc(int char, FILE *stream);
  • 기능: 한 문자를 파일에 출력합니다.
  • 예시:
    FILE *file = fopen("output.txt", "w");
    fputc('A', file); // 파일에 문자 'A' 출력
    fclose(file);

fgetc()

  • 형식: int fgetc(FILE *stream);
  • 기능: 파일에서 한 문자를 읽어 반환합니다.
  • 예시:
    FILE *file = fopen("input.txt", "r");
    char ch = fgetc(file); // 파일에서 한 문자 읽기
    fclose(file);

fputs()

  • 형식: int fputs(const char *str, FILE *stream);
  • 기능: 문자열을 파일에 출력합니다.
  • 예시:
    FILE *file = fopen("output.txt", "w");
    fputs("Hello, File!", file); // 파일에 문자열 출력
    fclose(file);

fgets()

  • 형식: char *fgets(char *str, int n, FILE *stream);
  • 기능: 파일에서 문자열을 읽어 str에 저장합니다.
  • 예시:
    FILE *file = fopen("input.txt", "r");
    char str[100];
    fgets(str, 100, file); // 파일에서 문자열 읽기
    fclose(file);

기타 함수

sprintf()

  • 형식: int sprintf(char *str, const char *format, ...);
  • 기능: 형식화된 문자열을 str에 저장합니다.
  • 예시:
    char buffer[100];
    int num = 10;
    sprintf(buffer, "Number: %d", num); // buffer에 문자열 저장

sscanf()

  • 형식: int sscanf(const char *str, const char *format, ...);
  • 기능: 문자열에서 형식화된 입력을 읽어 변수에 저장합니다.
  • 예시:
    char str[] = "Number: 10";
    int num;
    sscanf(str, "Number: %d", &num); // 문자열에서 정수 읽기

표준 입출력 함수 사용시 유의사항

  • 실전에서는gets()는 버퍼 오버플로우 문제가 있어 주로 fgets()를 대신해서 사용한다.
  • scanf()는 공백을 포함한 문자열 입력에 적합하지 않아 fgets()를 사용하는 것이 좋다.
  • 파일 입출력 함수 사용 시 파일을 열고(fopen) 닫는(fclose) 과정이 필요하다.

표준 입출력 함수를 정리했기 때문에 다음 글에서는 버퍼에 대해 다룰것이다.


0개의 댓글

관련 채용 정보