입출력
scanf("%d", &age); // scanf : 입력 함수
printf("Hello, World!"); // prinf : 출력 함수
- scanf 사용 시 변수의 형태에 맞는 변환 문자 사용 및 입력할 변수 앞에 & 입력 필수
변환 문자
- %d = 정수, %lf = 실수, %o = 8진수, %x = 16진수(소문자), %X = 16진수(대문자)
- %f= 소수(기본 6자리), %.nf = 소숫점 n자리까지 출력
- %c = 단일 문자, %s = 문자열
- %n = 왼쪽 n칸 비우고 출력, %-n = 오른쪽 n칸 비우고 출력
int num = 100;
printf("%d", num); // 10진수 정수
printf("%o", num); // 8진수 0144
printf("%x", num); // 16진수 (소문자) 0x64
printf("%X", num); // 16진수 (대문자) 0X64
float f = 3.14;
double d = 3.141592;
printf("%f", f); // 소수점 형식 (기본 6자리)
printf("%.2f", f); // 소수점 2자리까지 3.14
printf("%e", d); // 지수 표현 (3.141592e+00)
char ch = 'A';
char str[] = "Hello"; // C에는 String이 없음 -> char[]
printf("%c", ch); // 단일 문자
printf("%s", str); // 문자열
printf("%5d", 10); // " 10" (5칸 확보, 오른쪽 정렬)
printf("%-5d", 10); // "10 " (왼쪽 정렬)
printf("%05d", 10); // "00010" (0으로 채움)
printf("%10.2f", 3.14); // " 3.14" (전체 10칸, 소수점 2자리)
scanf("%d", &age); // 정수 입력
scanf("%c", &char); // 문자 입력
scanf("%s", name); // 문자열 입력 (& 불필요)
scanf("%f", &height); // 실수 입력(float)
scanf("%lf", &height); // 실수 입력(double)
※ scanf를 여러번 할 경우 char를 입력받는 순서가 맨 처음이 아니라면 한 칸을 띄우고 %c를 입력해야 함
- %d, %f, %s는 자동으로 앞의 공백 문자를 건너 뛰지만 %c는 공백 문자도 하나의 문자로 취급하기 때문
ex) scanf( %c, &a);
※ printf의 경우에는 %f와 %lf 모두 같은
가변 인자 함수 규칙
- printf, va_list, va_strart 와 같은 대부분의 가변 인자 함수들은 변수 입력 시 해당 변수의 타입이 자동으로 승격됨 (scanf는 제외)
ex) float -> double
- 해당 부분으로 인하여 printf에서는 %f와 %lf 적용 시 %f의 float이 자동 변환되어 둘 다 double로 인식되지만 scanf에서는 값이 아닌 포인터를 받기 때문에 %f의 float이 자동 변환이 발생하지 않아 %f와 %lf가 서로 다르게 인지됨
float f;
double d;
// printf: 값 전달 → 자동 변환 ✅
printf("%f", f); // float → double 자동 변환
// scanf: 주소 전달 → 자동 변환 안 됨 ❌
scanf("%f", &f); // float 주소 (4바이트 메모리)
scanf("%lf", &d); // double 주소 (8바이트 메모리)
// 잘못 쓰면?
scanf("%f", &d); // 8바이트 공간에 4바이트만 씀 → 버그!
```
## 시각화
### printf (값 전달)
```
코드: printf("%f", f);
메모리: [float f: 4바이트]
↓ 자동 변환
스택: [double: 8바이트] ← printf가 읽음
```
### scanf (주소 전달)
```
코드: scanf("%f", &f);
메모리: [float f: 4바이트] ← 주소
↓ 주소 그대로 전달
scanf: 이 주소에 4바이트 씀
코드: scanf("%lf", &d);
메모리: [double d: 8바이트] ← 주소
↓ 주소 그대로 전달
scanf: 이 주소에 8바이트 씀
댓글