C 언어에서 표준 입출력 함수는 <stdio.h> 헤더 파일에 정의되어 있다.
이 함수들은 콘솔(터미널)을 통해 데이터를 입력받고 출력하는 데 사용된다.
더 배우다보니 버퍼오버플로우 취약점이 있다는점도 알게되었고, 버퍼를 통해 입력이 되기에 각종 입력 함수를 섞어 쓰면 예상과 다르게 프로그램이 돌아가게 되어서 fflush 함수 등을 통해 버퍼를 초기화해줘야하는 경우도 있었다.
이처럼 점점 아는게 많아질수록 헷갈리는게 많아졌고,scanf와 printf만 주구장창 써온 나에게는 puts와 gets 중 어떤게 입력인지 출력인지도 가끔 헷갈렸다.
또한
ch = getchar();
gets(str);
위 예제들처럼 비슷해보여도 사용법이 조금씩 다른 경우가 있어 헷갈리는 경우도 있었다.
앞으론 헷갈리지 않기위해 각 함수들의 차이를 한눈에 살펴볼 수 있도록 보기좋게 정리해보겠다.
출력함수는 printf()
외에도 같은 p
로 시작하는 putchar()
puts()
가 있다.
입력 출력이 조금이라도 헷갈릴땐 출력함수들은 printf와 같은 p로 시작한다는 점을 항상 생각하였다.
int printf(const char *format, ...);
int num = 10;
printf("Number: %d\n", num); // 출력: Number: 10
int putchar(int char);
putchar('A'); // 출력: A
int puts(const char *str);
\n
)을 추가합니다.puts("Hello, World!"); // 출력: Hello, World!\n
int scanf(const char *format, ...);
int num;
scanf("%d", &num); // 사용자로부터 정수 입력 받기
int getchar(void);
char ch = getchar(); // 사용자로부터 한 문자 입력 받기
char *gets(char *str);
str
에 저장합니다. (보안 문제로 인해 사용을 권장하지 않음)char str[100];
gets(str); // 사용자로부터 문자열 입력 받기 (위험!)
char *fgets(char *str, int n, FILE *stream);
stream
에서 문자열을 읽어 str
에 저장합니다. (stdin
을 사용하면 표준 입력에서 읽음)char str[100];
fgets(str, 100, stdin); // 사용자로부터 문자열 입력 받기 (안전)
int fprintf(FILE *stream, const char *format, ...);
FILE *file = fopen("output.txt", "w");
fprintf(file, "Hello, File!"); // 파일에 문자열 출력
fclose(file);
int fscanf(FILE *stream, const char *format, ...);
FILE *file = fopen("input.txt", "r");
int num;
fscanf(file, "%d", &num); // 파일에서 정수 읽기
fclose(file);
int fputc(int char, FILE *stream);
FILE *file = fopen("output.txt", "w");
fputc('A', file); // 파일에 문자 'A' 출력
fclose(file);
int fgetc(FILE *stream);
FILE *file = fopen("input.txt", "r");
char ch = fgetc(file); // 파일에서 한 문자 읽기
fclose(file);
int fputs(const char *str, FILE *stream);
FILE *file = fopen("output.txt", "w");
fputs("Hello, File!", file); // 파일에 문자열 출력
fclose(file);
char *fgets(char *str, int n, FILE *stream);
str
에 저장합니다.FILE *file = fopen("input.txt", "r");
char str[100];
fgets(str, 100, file); // 파일에서 문자열 읽기
fclose(file);
int sprintf(char *str, const char *format, ...);
str
에 저장합니다.char buffer[100];
int num = 10;
sprintf(buffer, "Number: %d", num); // buffer에 문자열 저장
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
) 과정이 필요하다.표준 입출력 함수를 정리했기 때문에 다음 글에서는 버퍼에 대해 다룰것이다.