c언어

scanf + 문자열 입력 +sizeof 정리

lsjking911 2026. 5. 30. 21:25

✅ 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