본문 바로가기
C

입출력 구조

by Mecodata 2025. 11. 28.

입출력

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바이트 씀

 

 

'C' 카테고리의 다른 글

C언어 정의  (0) 2025.11.28

댓글