✅ 1. scanf란?
키보드로 입력받은 값을 변수에 저장하는 함수
✅ 2. 기본 구조
scanf("format 문자열", 변수의 주소);
- format 문자열 → 입력 받을 데이터 형식
- 변수 주소 → 값을 저장할 위치
✅ 3. 기본 사용
정수 입력
int a;
scanf("%d", &a);
- %d → 정수 입력
- &a → 변수 a의 주소
실수 입력
float a;
scanf("%f", &a);
double b;
scanf("%lf", &b);
👉 ⚠️ 중요
- float → %f
- double → %lf
문자 입력
char c;
scanf("%c", &c);
문자열 입력
char str[100];
scanf("%s", str);
👉 배열 이름은 주소이므로 & 필요 없음
✅ 4. 여러 값 입력
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
👉 순서대로 입력값이 저장됨
✅ 5. format 문자열 의미
👉 입력 데이터의 형태를 지정
| 형식 | 의미 |
| %d | 정수 |
| %f | 실수(float) |
| %lf | 실수(double) |
| %c | 문자 |
| %s | 문자열 |
✅ 6. 가장 중요한 개념 🔥
1) 주소 필요
👉 값을 변수에 저장하려면 위치(주소)가 필요
scanf("%d", &a);
2) 배열은 예외
char str[100];
scanf("%s", str);
👉 배열 이름 자체가 주소 → & 안 붙임
3) 형식 반드시 맞춰야 함
double b;
scanf("%f", &b); // ❌ 잘못됨
👉 타입 다르면 오류 발생
문자열 입력 주의사항
char str[100];
// ❌ 위험: 길이 제한 없음 (버퍼 오버플로우 가능)
scanf("%s", str);
// ✅ 올바른 방법: 길이 제한 설정
scanf("%99s", str);
// ❌ 잘못된 코드 (sizeof 사용 X)
scanf("%s", str, sizeof(str)); // 추가 인자 안 씀
핵심 정리
- 문자열은 char 배열로 선언해야 한다
- 배열 이름은 주소이므로 &를 붙이지 않는다
- %s는 길이 제한이 없어 위험하다
- → %99s처럼 배열 크기보다 1 작게 제한해야 한다
- 공백(스페이스)이 나오면 입력이 끊긴다
🔥 널 문자 (\0) 처리
👉 C 문자열은 항상 끝에 널 문자(\0)가 자동으로 추가됨
hello 입력 →
['h','e','l','l','o','\0']
👉 따라서:
- 배열 크기 100 → 실제 입력 가능 글자 수 = 99
- 마지막 1칸은 \0 저장용
✅ 한 줄 정리
문자열 입력 시 배열을 사용하고 길이 제한을 설정해야 하며, 문자열 끝에는 널 문자(\0)가 자동으로 추가된다.
❗ scanf에서 sizeof 사용
scanf("%s", str, sizeof(str));
👉 ❌ 결론:
sizeof는 scanf에서 아무 의미 없음 (완전히 무시됨)
👉 실제 동작:
scanf("%s", str);
올바른 방법 (길이 제한)
char str[100];
scanf("%99s", str);
👉 특징
- 배열 크기보다 1 작게 입력 제한
- 마지막 1칸은 \0(널 문자) 저장용
- 버퍼 오버플로우 방지 가능
❌ 주의할 방법 (길이 제한 필요 없음)
char str[100];
scanf("%s", str);
👉 문제
- %s는 입력 길이를 제한하지 않음
- 배열 크기를 넘는 입력 → 메모리 침범 가능
❌ 혼동하기 쉬운 경우 (sizeof 사용)
char str[100];
scanf("%s", str, sizeof(str));
👉 설명
- sizeof(str)는 scanf에서 사용되지 않음
- 함수 동작에 영향을 주지 못함
✅ sizeof가 사용되는 경우
char str[100];
fgets(str, sizeof(str), stdin);
👉 특징
- 배열 크기를 기준으로 입력 길이 제한 가능
- 공백 포함 문자열 입력 가능
✅ ✅ 한 줄 정리
문자열 입력 시 scanf에서는 %Ns로 길이를 제한해야 하며, sizeof는 fgets에서 사용되는 방식이다.
비교 정리
| 구분 | scanf | printf |
| 역할 | 입력 | 출력 |
| format 의미 | 입력 형식 | 출력 형식 |
| 데이터 전달 | 주소 사용 | 값 사용 |
| 문자열 처리 | 배열 그대로 사용 | 문자열 그대로 출력 |
| 길이 제한 | 직접 지정해야 함 (%99s) | 필요 없음 |
핵심 주의사항
🔹 scanf
- 배열 사용 (char str[])
- & 쓰지 않음 (배열 = 주소)
- %s는 길이 제한 없음 → 위험
- → %99s처럼 직접 제한
- 공백 입력 시 끊김
🔹 printf
- %s로 문자열 출력
- 그대로 화면에 출력됨
- 길이 제한 필요 없음4
🔥 널 문자 (\0)
char str[100];
scanf("%99s", str);
printf("%s\n", str);
👉 입력:
hello
👉 내부 저장:
['h','e','l','l','o','\0']
👉 핵심:
- 문자열 끝에 \0 자동 추가
- 배열 크기 = 입력 길이 + 1 필요
✅ ✅ 최종 한 줄 정리
scanf는 문자열을 입력받아 저장하고 printf는 문자열을 출력하며, 문자열은 배열로 처리되고 끝에는 널 문자(\0)가 자동으로 추가된다.
'c언어' 카테고리의 다른 글
| 회원가입 프로그램 (0) | 2026.05.31 |
|---|---|
| 문자열 입력 시 한글과 배열 크기 주의사항 (0) | 2026.05.31 |
| int main(void)정리 (0) | 2026.05.30 |
| printf(화면에 값을 출력하는 함수) (0) | 2026.05.30 |
| 상수(변하지 않는 수) (0) | 2026.05.30 |