표준 입출력 함수
✒️ 2025-05-15 15:53 내용 수정
수제비 2024 정보처리기사 필기 5판 1권의 내용을 정리
TCPSchool의 내용을 정리
사용자가 프로그램과 대화하기 위해 사용하는 함수
- Java, Python에서도 사용하였다.
- Java의 파일 입출력과 스트림, Python의 사용자 입출력#출력 print 함수 참고.
- C의 입출력 참고.
기본 출력 함수
이스케이프 시퀀스
- C에서 지원하는 이스케이프 시퀀스는 다음과 같다.
',",?,\를 사용하려면 앞에\를 붙여야 한다.
| 이스케이프 시퀀스 | 기능 | 비고 |
|---|---|---|
\a |
경고음 발생 | |
\b |
백스페이스 | |
\n |
줄바꿈 | |
\r |
캐리지 리턴 | |
\t |
수평 탭(tab) | |
\v |
수직 탭(tab) | 프린터 출력시만 |
\f |
폼 피드(form feed) | 프린터 출력시만 |
printf("first line\nsecond line");
서식 지정자
- 출력할 데이터의 서식을 지정할 때 사용하는 문자이다.
- Java의 파일 입출력과 스트림#표준 입출력 System 클래스, Python의 문자열 포매팅(Formatting) 참고.
| 서식 지정자 | 데이터 |
|---|---|
%c |
문자 1개(char) |
%s |
문자열(string) |
%d |
부호 있는 10진 정수 |
%i |
부호 있는 10진 정수(int) |
%f |
고정 소수점 실수(소수점 6자리 이하) |
%o |
부호 없는 8진 정수(oct) |
%u |
부호 없는 10진 정수 |
%x |
부호 없는 16진 정수(소문자 사용) (hex) |
%X |
부호 없는 16진 정수(대문자 사용) (hex) |
%e |
부동 소수점으로 표현한 실수(e 표기법) |
%E |
부동 소수점으로 표현한 실수(E 표기법) |
%g |
값에 따라 %f나 %e 사용 |
%G |
값에 따라 %f나 %E 사용 |
%% |
% 출력 |
%p |
포인터 주소 |
printf("test char : %c", 'a');
printf("%d %s apples", 5, "golden");
- 숫자를 결합하면 출력 필드 폭을 설정할 수 있으며, 소수점 자리수를 지정할 수 있다.
#include <stdio.h>
int main()
{
printf("|%.3f|\n", 3.141592);
printf("|%+10.3f|\n", 3.141592);
printf("|%-10.3f|\n", 3.141592);
return 0;
}
|3.142|
| +3.142|
|3.142 |
1. printf()
- C의 표준 출력 함수로, 여러 종류의 데이터를 다양한 서식에 맞춰 출력할 수 있다.
f는 formatted의 약자로, 서식화된 출력을 지원한다.
printf("%d %s apples", 5, "golden");
2. putchar()
- 표준 출력 스트림(
stdout)인 모니터에 하나의 문자를 출력한다.
#include <stdio.h>
int putchar(int c);
#include <stdio.h>
int main(void)
{
int putchar(int c);
putchar(65);
return 0;
}
A
3. fputc()
putchar()와 비슷하지만 문자를 출력할 스트림을 인수로 전달하여 직접 지정할 수 있다.- 모니터 뿐만 아니라 파일을 통해서도 문자를 출력(저장) 할 수 있다.
#include <stdio.h>
int fputc(int c, FILE *stream);
#include <stdio.h>
int main(void)
{
int fputc(int c, FILE *stream);
FILE* fout = fopen("전체경로\\fput.txt", "w");
for (int i = 0; i < 10; i++)
{
fputc(i+65, fout);
}
fclose(fout);
return 0;
}
ABCDEFGHIJ
4. puts()
- 표준 출력 스트림(
stdout)인 모니터에 하나의 문자열을 출력하는 함수다. puts()는 문자열을 출력할 때 자동으로 줄바꿈(개행)한다.printf()는 형식 지정자를 지정해야 하지만puts()는 형식 지정자 없이 문자열을 출력할 수 있다.
#include <stdio.h>
int puts(const char *s);
#include <stdio.h>
int main() {
char str1[] = "Hello World";
char str2[] = "Apple Kiwi Banana";
puts(str1); // 문자열 출력 후 자동 개행
puts(str2);
return 0;
}
Hello World
Apple Kiwi Banana
5. fputs()
puts()와 비슷하지만 모니터 뿐만 아니라 파일을 통해서도 문자를 출력(저장)할 수 있는 함수다.- 첫 번째 인수 : 출력할 문자열을 가리키는 포인터
- 두 번째 인수 : 문자열을 출력할 스트림
puts()와 다르게 문자열을 출력한 다음 자동으로 줄바꿈 하지 않는다.
#include <stdio.h>
int fputs(const char * restrict s, FILE * restrict stream);
#include <stdio.h>
int main() {
FILE *file = fopen("전체경로\\fputsResult.txt", "w");
if (file == NULL) {
printf("파일을 열 수 없습니다.\n");
return 1;
}
fputs("파일에 fputs() 함수로 새 문자열 저장하기", file); // 파일에 문자열 쓰기
fclose(file); // 파일 닫기
printf("파일에 문자열을 성공적으로 저장했습니다.\n");
return 0;
}
파일에 fputs() 함수로 새 문자열 저장하기
기본 입력 함수
1. scanf()
- C의 표준 입력 함수로, 사용자로부터 다양한 데이터를 서식에 맞춰 입력 받는 함수다.
f는 formatted의 약자로, 서식화된 출력을 지원한다.- 주소 연산자
&를 사용해야 입력 받은 값을 변수에 저장할 수 있다.- 포인터 참고.
- 입력 버퍼에 문제가 있어
getchar()로 버퍼를 비우는 것이 좋다.
#include <stdio.h>
int scanf(const char * format, ...);
#include <stdio.h>
int main(void) {
int a, b;
printf("첫 번째 정수 입력 : \n");
scanf("%d", &a);
printf("두 번째 정수 입력 : \n");
scanf("%d", &b);
printf("입력 받은 두 정수 : %d와 %d", a, b);
return 0;
}
2. getchar()
- 표준 입력 스트림(
stdin)인 키보드로부터 하나의 문자를 입력 받는다.
#include <stdio.h>
int getchar(void);
#include <stdio.h>
int getchar(void);
int main(void)
{
char ch = getchar();
printf("입력 받은 문자 : %c\n", ch);
return 0;
}
문자을 입력해주세요 :
a
입력 받은 문자 : a
3. fgetc()
getchar()와 비슷하지만 문자를 입력 받을 스트림을 인수로 전달하여 직접 지정할 수 있다.- 키보드 뿐만 아니라 파일을 통해서도 입력을 받을 수 있다.
#include <stdio.h>
int fgetc(FILE *stream);
#include <stdio.h>
int main() {
FILE *fp;
char ch;
fp = fopen("전체경로\\charInput.txt", "r");
if (fp == NULL) {
perror("파일을 열 수 없습니다");
return 1;
}
// 한 문자씩 읽어서 출력
// EOF : 파일에 마지막에 도달하면 반환되는 값
while ((ch = fgetc(fp)) != EOF) {
putchar(ch); // 파일에서 읽은 문자 출력
}
fclose(fp); // 파일 닫기
return 0;
}
4. fgets()
- 키보드(
stdin) 뿐만 아니라 파일에서도 문자열을 입력 받을 수 있는 함수다.- 첫 번째 인수 : 입력 받는 문자열을 저장하기 위해 선언한 배열의 시작 주소
- 두 번째 인수 : 입력 받을 수 있는 문자열의 최대 길이
- 세 번째 인수 : 문자열을 입력 받을 스트림
- 입력 버퍼 오버플로우 방지를 위해
scanf("%s", str)보다 안전하게 문자열을 받을 수 있다.
#include <stdio.h>
char *fgets(char * restrict s, int n, FILE * restrict stream);
#include <stdio.h>
int main() {
char str[50]; // 최대 49자 + 널 문자('\0') 저장 가능
printf("문자열을 입력하세요: ");
fgets(str, sizeof(str), stdin); // 최대 (sizeof(str) - 1) 글자 입력
printf("입력된 문자열: %s", str);
return 0;
}
문자열을 입력하세요: Hello World
입력된 문자열: Hello World