공부해보잠
데이터 입·출력 본문
데이터 입출력
C 언어에서 표준 입출력 함수는 키보드 입력을 받고, 화면에 출력하는 함수입니다.
대표적으로 scanf(), printf(), getchar(), putchar(), puts() 등이 있습니다.
C 언어 표준 입·출력 함수 정리
함수명설명예제
함수 | 설명 | 예제 |
printf() | 문자열 및 변수 값을 화면에 출력 | printf("Hello, World!\n"); |
scanf() | 키보드 입력을 받아 변수에 저장 | scanf("%d", &num); |
getchar() | 한 문자 입력 (엔터 입력까지 대기) | ch = getchar(); |
putchar() | 한 문자 출력 | putchar(ch); |
puts() | 문자열 출력 (자동 개행 포함) | puts("Hello!"); |
printf()와 scanf()는 가장 많이 사용되는 입출력 함수
puts()는 자동 개행(\n) 포함하여 문자열 출력
scanf() 함수
C 언어의 표준 입력 함수로, 키보드 입력을 받아 변수에 저장하는 함수 입니다.
형식
scanf("서식문자열", 변수주소);
- 서식문자열: 입력 받을 데이터의 형식을 지정 (%d, %f, %c, %s 등)
- 변수 주소 (&변수명): 입력받은 값을 저장할 변수의 주소 지정 (& 필요)
scanf("%3d",&a);
// %서식 문자임을 지정, 3입력자릿수를 3자리로 지정, d 10진수로 입력
//&a입력받은 데이터를 변수 a주소에 저장
주요 특징
- 입력한 값이 변수에 저장됨
- 변수의 주소(&변수명)를 반드시 사용해야 함 (문자열 제외)
- 띄어쓰기(공백) 또는 Enter 입력 시 값이 구분됨
- scanf()는 공백을 무시하지만, 문자열 입력 시 공백을 포함하지 않음
- 배열(문자열) 입력 시 & 필요 없음
서식문자열
- printf() 함수에서 사용하는 서식 문자열과 동일하게 적용
- 주요 서식문자:
서식 문자 설명 %d 정수 입력 %f 실수 입력 %c 문자 입력 %s 문자열 입력 %lf double형 실수 입력
scanf 예제1 - 정수 입력받기
문제
사용자로부터 정수를 입력받아, 입력한 숫자를 출력하는 프로그램을 작성하세요.
출력 값 : 10
#include <stdio.h>
int main() {
int a; // 정수를 저장할 변수 a 선언
printf("숫자를 입력하세요: "); // 입력 안내 메시지 출력
scanf("%d", &a); // 사용자가 입력한 정수를 변수 a에 저장
printf("입력한 숫자: %d\n", a); // 변수 a의 값을 출력
return 0;
}
scanf 예제2 -두 개의 정수 입력받아 합 구하기
문제
사용자로부터 두 개의 정수를 입력받아, 그 합을 출력하는 프로그램을 작성하세요.
#include <stdio.h>
int main() {
int a, b; // 두 개의 정수를 저장할 변수 선언
printf("숫자를 입력하세요: "); // 입력 안내 메시지 출력
scanf("%d %d", &a, &b); // 두 개의 정수를 입력받아 변수 a, b에 저장
printf("숫자의 합: %d\n", a + b); // a와 b를 더한 결과 출력
return 0;
}
scanf 예제3 - 실수 입력받아 출력하기
문제
사용자로부터 실수를 입력받아, 입력한 값을 소수 둘째 자리까지 출력하는 프로그램을 작성하세요.
float 사용시
#include <stdio.h>
int main() {
float a; //실수를 저장할 변수 선언
printf("실수를 입력하세요: "); // 입력 안내 메시지 출력
scanf("%f", &a); //사용자가 입력한 실수를 변수 a에 저장
printf("소숫점 둘째자리: %.2f\n", a); //소수점 둘째 자리까지 출력
return 0;
}
double 사용시
#include <stdio.h>
int main() {
double a; // 더 정밀한 실수를 저장할 변수 선언
printf("실수를 입력하세요: ");
scanf("%lf", &a); //`double`형 입력은 `%lf` 사용
printf("소숫점 둘째자리: %.2lf\n", a); //`double` 출력 시 `%.2lf`
return 0;
}
scanf 예제4 -문자 입력받아 출력하기
문제
사용자로부터 한 개의 문자를 입력받아, 입력한 문자를 출력하는 프로그램을 작성하세요.
#include <stdio.h>
int main() {
char a; // 문자를 저장할 변수 선언
printf("문자를 입력하세요: "); // 입력 안내 메시지 출력
scanf("%c", &a); //사용자가 입력한 문자를 변수 a에 저장
printf("문자를 출력하세요: %c", a); //변수 a에 저장된 문자 출력
return 0;
}
scanf 예제5- 문자열 입력받아 출력하기
문제
사용자로부터 문자열을 입력받아, 입력한 문자열을 출력하는 프로그램을 작성하세요.
#include <stdio.h>
int main() {
char str[100]; // 문자열을 저장할 배열 선언 (최대 99자 + `\0` 포함)
printf("문자열을 입력하세요: ");
scanf("%s", str); // 문자열 입력 (`&` 필요 없음)
printf("문자열을 출력하세요: %s", str);
return 0;
}
scanf("%s", str);는 공백을 기준으로 입력을 나누므로, 띄어쓰기 포함된 문자열 입력 불가
공백 포함 문자열 입력받으려면 gets(), fgets() 사용
fgets 사용
#include <stdio.h>
int main() {
char str[100];
printf("문자열을 입력하세요: ");
fgets(str, sizeof(str), stdin); // 공백 포함 문자열 입력 가능
printf("문자열을 출력하세요: %s", str);
return 0;
}
문자열을 저장하려면 char 배열 사용 (char str[100];)
문자열 입력 시 scanf("%s", str);에서 & 필요 없음
공백 포함 문자열 입력은 fgets(str, sizeof(str), stdin); 사용
Java 표준 입력 (Scanner 클래스 사용)
Java에서는 표준 입력을 받을 때 Scanner 클래스를 주로 사용합니다
import java.util.Scanner; // Scanner 클래스 임포트
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); // Scanner 객체 생성
System.out.print("정수를 입력하세요: ");
int num = scanner.nextInt(); // 정수 입력
System.out.print("문자열을 입력하세요: ");
String str = scanner.next(); // 공백 없는 문자열 입력
System.out.println("입력한 정수: " + num);
System.out.println("입력한 문자열: " + str);
scanner.close(); // Scanner 닫기 (자원 해제)
}
}
Scanner의 주요 입력 메서드
메서드 | 설명 | 입력 예시 |
nextInt() | 정수 입력 (int) | 10 |
nextDouble() | 실수 입력 (double) | 3.14 |
next() | 단어 입력 (공백 포함 불가) | Hello |
nextLine() | 한 줄 입력 (공백 포함 가능) | Hello World |
nextBoolean() | true 또는 false 입력 | true |
공백 포함 문자열 입력받기 (nextLine())
주의: 숫자 입력 후 nextLine()을 사용할 때는 버퍼 문제 발생 가능
해결 방법: scanner.nextLine();을 한 번 추가하여 개행 문자 제거
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("정수를 입력하세요: ");
int num = scanner.nextInt();
scanner.nextLine(); // 개행 문자 제거 (버퍼 문제 해결)
System.out.print("문자열을 입력하세요: ");
String str = scanner.nextLine(); // 공백 포함 문자열 입력 가능
System.out.println("입력한 정수: " + num);
System.out.println("입력한 문자열: " + str);
scanner.close();
}
}
//scanner.nextLine();을 추가하면 숫자 입력 후 문자열 입력이 정상적으로 동작
- Java에서 키보드 입력을 받을 때 Scanner 클래스를 사용
- Scanner를 사용하려면 import java.util.Scanner; 추가해야 함
- 숫자 입력 (nextInt(), nextDouble()), 문자열 입력 (next(), nextLine()) 가능
- 공백 포함된 문자열 입력은 nextLine() 사용
- 숫자 입력 후 nextLine()을 사용할 경우, scanner.nextLine();을 추가하여 버퍼 문제 해결
- 입력 후 scanner.close();로 자원 해제
printf() 함수
C 언어의 표준 출력 함수로 인수로 주어진 값을 화면에 출력합니다
형식
printf("서식문자열", 출력할 값1, 출력할 값2, ...);
- 서식문자열: 출력할 형식 지정 (%d, %f, %c, %s 등)
- 출력할 값: 서식문자에 맞는 변수 또는 값
printf() 함수 - 주요 제어문자(이스케이프 시퀀스) 정리
C 언어에서 printf() 함수는 제어문자(이스케이프 시퀀스) 를 사용하여 출력 형식을 조정할 수 있습니다.
주요 제어문자 (이스케이프 시퀀스)
제어문자 | 의미 | 예제 | 출력 결과 |
\n | 줄 바꿈 (개행) | printf("Hello\nWorld"); | Hello World |
\t | 탭 (4~8칸 공백) | printf("A\tB"); | A B |
\\ | 백슬래시 출력 | printf("\\"); | \ |
\" | 큰따옴표 출력 | printf("\"Hello\""); | "Hello" |
\' | 작은따옴표 출력 | printf("\'A\'"); | 'A' |
\b | 백스페이스 (이전 문자 삭제) | printf("ABC\bD"); | ABD |
\r | 캐리지 리턴 (줄 맨 앞으로 이동) | printf("Hello\rWorld"); | World (Hello 덮어쓰기) |
\f | 폼 피드 (페이지 넘김) | printf("Hello\fWorld"); | Hello (새로운 페이지에서 World 출력) |
\v | 수직 탭 (줄 간격 크게) | printf("A\vB"); | A ↕ B (줄 사이 간격 확대) |
\a | 경고음 (벨 소리) | printf("\a"); | (컴퓨터에서 경고음 발생) |
예제
#include <stdio.h>
int main() {
printf("Hello\nWorld\n"); // 줄 바꿈
printf("Name:\tJohn Doe\n"); // 탭
printf("Path: C:\\Program Files\\\n"); // 백슬래시 출력
printf("\"C programming is fun!\"\n"); // 큰따옴표 출력
printf("\'Single Quotes\'\n"); // 작은따옴표 출력
printf("ABCD\bE\n"); // 백스페이스 적용 (D 삭제 후 E 출력)
printf("123\r456\n"); // 캐리지 리턴 (123을 456으로 덮어씀)
printf("Hello\fWorld\n"); // 폼 피드 (새 페이지로 이동)
printf("A\vB\n"); // 수직 탭 출력
printf("\a"); // 경고음 출력
return 0;
}
출력 예시
Hello
World
Name: John Doe
Path: C:\Program Files\
"C programming is fun!"
'Single Quotes'
ABCE
456
Hello
World
A
B
(컴퓨터에서 경고음 발생)
printf()를 이용한 여러 개의 데이터 출력 (진법 변환)
#include <stdio.h>
int main() {
int num = 250; // 10진수 값 250을 변수에 저장
printf("250은 10진수로 %d\n", num); // 10진수 출력
printf("8진수로 %o\n", num); // 8진수 출력
return 0;
}
------------------------------------------------------------
실행 결과
250은 10진수로 250
8진수로 372
첫 번째 출력 (%d)
250은 10진수로 %d\n → %d는 10진수 정수를 출력
따라서, 250이 그대로 출력됨
두 번째 출력 (%o)
8진수로 %o\n → %o는 8진수로 변환하여 출력
250을 8진수로 변환하면 372
-----------------------------------------------------------------
진법 변환 (250을 8진수로 변환하는 과정)
10진수 250을 8진수로 변환
250 ÷ 8 = 31 (몫), 2 (나머지)
31 ÷ 8 = 3 (몫), 7 (나머지)
3 ÷ 8 = 0 (몫), 3 (나머지)
따라서, 8진수 372
데이터를 출력할 경우 결과
번호코드출력 결과설명
번호 | 코드 | 출력 결과 | 설명 |
① | printf("%d", 2543); | 2543 | 정수를 그대로 출력 |
② | printf("%3d", 2543); | 2543 | 최소 3자리 공간 확보 (이미 4자리이므로 영향 없음) |
③ | printf("%6d", 2543); | 2543 | 최소 6자리 확보, 앞쪽 공백 추가 |
④ | printf("%-6d", 2543); | 2543 | 최소 6자리 확보, 왼쪽 정렬 |
⑤ | printf("%06d", 2543); | 002543 | 최소 6자리 확보, 빈칸을 0으로 채움 |
⑥ | printf("%f", 245.2555); | 245.255500 | 기본 float 출력 (소수점 6자리) |
⑦ | printf("%.3f", 245.2555); | 245.256 | 소수점 3자리까지 반올림 |
⑧ | printf("%8.2f", 245.2555); | 245.26 | 최소 8자리 확보, 소수점 2자리까지 출력 |
⑨ | printf("%e", 245.2555); | 2.452555e+02 | 지수 표기법 출력 |
⑩ | printf("%3s", "help me"); | help me | 최소 3자리 확보 (이미 길이가 7이므로 영향 없음) |
⑪ | printf("%8s", "help me"); | help me | 최소 8자리 확보, 앞쪽 공백 추가 |
⑫ | printf("%.6s", "help me"); | help m | 문자열에서 최대 6문자만 출력 |
⑬ | printf("%-8.6s", "help me"); | help m | 최대 6문자 출력, 왼쪽 정렬 |
⑭ | printf("250은 10진수로 %d\t 8진수로 %o\n", 250, 250); | 250은 10진수로 250 8진수로 372 | 10진수 출력 후 탭(\t), 8진수 변환 출력 |
⑮ | printf("a=%8.2f\t b=%e\n", 125.23, 3141.592e-1); | a= 125.23 b=3.141592e+02 | 실수 정렬 후 출력 (8자리, 소수점 2자리 & 지수 표기법) |
⑯ | printf("\'A\'는 문자로 %c, 아스키코드로 %d\n", 'A', 'A'); | 'A'는 문자로 A, 아스키코드로 65 | 문자는 %c, 숫자는 ASCII 코드 값(65) |
- %d → 정수 출력
- %f / %.nf → 실수 출력 (.n은 소수점 자리수)
- %e → 지수 표기법
- %o → 8진수 출력
- %s / %.ns → 문자열 출력 (.n은 최대 출력 문자 수)
- %c → 문자 출력
- %- → 왼쪽 정렬
- %0n → 0을 채워 출력
- \t → 탭(정렬), \n → 줄 바꿈
Java의 출력 함수
Java에서는 System.out.print(), System.out.println(), System.out.printf() 를 사용하여 데이터를 출력할 수 있다.
print() - 줄 바꿈 없이 출력
System.out.print("Hello ");
System.out.print("World");
출력 결과
Hello World
줄 바꿈 없이 문자열을 연속 출력
println() - 출력 후 줄 바꿈
System.out.println("Hello");
System.out.println("World");
출력 결과
Hello
World
println()을 사용하면 출력 후 자동으로 줄 바꿈
printf() - 서식 지정 출력 (C언어의 printf()와 유사)
System.out.printf("이름: %s, 나이: %d, 키: %.2fcm\n", "Kim", 25, 175.5);
출력결과
System.out.printf("이름: %s, 나이: %d, 키: %.2fcm\n", "Kim", 25, 175.5);
%s → 문자열, %d → 정수, %.2f → 소수점 둘째 자리까지 출력
printf()의 주요 서식 문자
서식 문자 | 설명 | 예제 |
%d | 정수 출력 | System.out.printf("%d", 10); → 10 |
%f | 실수 출력 | System.out.printf("%f", 3.14); → 3.140000 |
%.2f | 소수점 둘째 자리까지 출력 | System.out.printf("%.2f", 3.1415); → 3.14 |
%s | 문자열 출력 | System.out.printf("%s", "Java"); → Java |
%c | 문자 출력 | System.out.printf("%c", 'A'); → A |
- print() → 줄 바꿈 없이 출력
- println() → 출력 후 줄 바꿈
- printf() → 서식 지정 출력 (%d, %f, %s 등 사용 가능)
기타 표준 입·출력 함수 정리
함수 | 분류 | 설명 |
getchar() | 입력 | 키보드로 한 문자를 입력받아 변수에 저장하는 함수 |
gets() | 입력 | 키보드로 문자열을 입력받아 변수에 저장하는 함수 (Enter 키 전까지 입력 가능) |
putchar() | 출력 | 인수로 주어진 한 문자를 화면에 출력하는 함수 |
puts() | 출력 | 인수로 주어진 문자열을 화면에 출력한 후 자동으로 줄을 바꾸는 함수 |
getchar() - 한 문자 입력받기
#include <stdio.h>
int main() {
char ch;
printf("문자 입력: ");
ch = getchar(); // 한 문자 입력받기
printf("입력한 문자: ");
putchar(ch); // 입력한 문자 출력
return 0;
}
실행 결과
문자 입력: A
입력한 문자: A
gets() - 문자열 입력받기 (비추천 - 보안 문제)
gets()는 버퍼 오버플로우(입력 길이 초과) 위험이 있어 사용하지 않는 것이 좋음.
대신 fgets()를 사용할 것을 권장!
#include <stdio.h>
int main() {
char str[100];
printf("문자열 입력: ");
gets(str); // 문자열 입력받기 (비추천)
printf("입력한 문자열: ");
puts(str); // 문자열 출력
return 0;
}
실행 결과
문자열 입력: Hello World
입력한 문자열: Hello World
fgets() - 문자열 입력 (보안 문제 해결)
#include <stdio.h>
int main() {
char str[100];
printf("문자열 입력: ");
fgets(str, sizeof(str), stdin); // 안전한 문자열 입력
printf("입력한 문자열: ");
puts(str); // 문자열 출력
return 0;
}
실행결과
문자열 입력: Hello World
입력한 문자열: Hello World
- getchar() → 한 문자 입력
- gets() → 문자열 입력 (보안 문제로 사용 지양, 대신 fgets() 사용)
- putchar() → 한 문자 출력
- puts() → 문자열 출력 후 자동 줄 바꿈
파일 입출력 함수
- 파일을 열고(fopen()), 읽고(fgetc(), fgets(), fscanf()), 쓰기(fputc(), fputs(), fprintf()), 닫는(fclose()) 함수로 구성됨.
- 표준 입출력(printf(), scanf())과 달리 파일과 직접 연결하여 데이터 저장 가능.
- 파일 모드(r, w, a 등)를 지정하여 파일을 다룰 수 있음.
파일 입출력의 기본 흐름
- 파일 열기 (fopen()) → 파일을 생성하거나 기존 파일을 엶
- 파일 읽기/쓰기 (fgetc(), fgets(), fscanf(), fputc(), fputs(), fprintf())
- 파일 닫기 (fclose()) → 파일을 닫아 메모리 누수를 방지
주요 파일 입·출력 함수
파일을 다루는 핵심적인 함수 (파일을 열고 닫고, 데이터를 읽고 쓰는 기본적인 기능)
함수 | 설명 |
fopen(파일명, 모드) | 파일을 열고 파일의 시작 주소(포인터)를 반환 |
fclose(파일 포인터) | 파일을 닫고 사용한 메모리를 해제 |
fscanf(파일 포인터, 서식 문자열, 변수 주소) | 파일에서 데이터를 읽어 변수에 저장 |
fprintf(파일 포인터, 서식 문자열, 변수) | 파일에 데이터를 서식 지정하여 출력 |
- 파일을 열고(fopen()), 닫고(fclose()), 읽고(fscanf()), 쓰는(fprintf()) 핵심 기능을 담당
- 파일을 다룰 때 반드시 필요한 함수들
기타 파일 입·출력 함수
파일에서 문자 단위로 읽고 쓰는 함수 (보조적인 역할)
함수 | 설명 |
fgetc() | 파일에서 한 문자 읽기 |
fgets() | 파일에서 문자열 한 줄 읽기 |
fputc() | 한 문자 파일에 출력 |
fputs() | 문자열을 파일에 출력하고 줄을 바꿈 |
- 파일에서 문자(fgetc(), fputc()) 또는 문자열(fgets(), fputs())을 읽고 쓰는 함수
- 파일 입출력에서 보조적으로 사용됨
예제
input.txt파일에서 숫자를 읽어 3을 곱한 후 output.txt파일로 출력하는 c언어 프로그램입니다. 결과를 확인하십시요.
#include <stdio.h>
int main() {
int x; // 정수를 저장할 변수 선언
// input.txt 파일을 "읽기(r)" 모드로 열기
FILE *ifp = fopen("input.txt", "r");
// output.txt 파일을 "쓰기(w)" 모드로 열기
FILE *ofp = fopen("output.txt", "w");
// input.txt에서 정수 하나를 읽어서 x에 저장
fscanf(ifp, "%d", &x);
// x의 값에 3을 곱함
x = x * 3;
// 변경된 x 값을 output.txt에 저장
fprintf(ofp, "%d", x);
// 파일 닫기
fclose(ofp); // output.txt 닫기
fclose(ifp); // input.txt 닫기
return 0;
}
실행 과정
- 파일 열기 (fopen())
- "input.txt" 파일을 읽기 모드("r") 로 열어 파일에서 데이터를 가져옴
- "output.txt" 파일을 쓰기 모드("w") 로 열어 결과를 저장할 준비를 함
- 파일에서 데이터 읽기 (fscanf())
- input.txt에 있는 숫자(128)을 읽어서 변수 x에 저장
- 연산 수행
- x에 3을 곱함 → 128 * 3 = 384
- 파일에 결과 저장 (fprintf())
- 연산된 값 384을 "output.txt" 파일에 저장
- 파일 닫기 (fclose())
- fclose(ifp); → input.txt 닫기
- fclose(ofp); → output.txt 닫기
실행 예시
입력 파일 (input.txt)
128
출력 파일 (output.txt)
384
요약
- fopen("파일명", "모드") → 파일 열기
- fscanf(파일포인터, "%d", &변수); → 파일에서 값 읽기
- fprintf(파일포인터, "%d", 변수); → 파일에 값 저장
- fclose(파일포인터); → 파일 닫기
출저 및 참고
정보처리 산업기사 기본서(시나공)