문자열의 입력과 출력 — printf·scanf의 %s·배열 이름과 주소·버퍼 오버플로우 | 기초 C언어 8.3.2
기초 C언어Chapter 08 배열 › Section 03 문자열과 char 배열
8.3.2 문자열의 입력과 출력
printf와 scanf의 %s로 char 배열 문자열을 출력하고 입력받는 방법. scanf에 배열 이름만 넘기는 까닭과 %s 입력의 두 가지 제한점.
영상 목차 · 원하는 부분부터 보기
01printf·scanf와 %s로 다루는 문자열교재 248p
- 앞 편에서 문자열을 char 배열로 다루고 끝에 널 문자 \0이 놓인다는 점을 확인. 이번 편은 그 배열을 printf로 출력하고 scanf로 입력받는 방법.
- 둘 다 4.3.3에서 이름을 입력받으며 먼저 만난 %s. 그때 &를 붙이지 않은 까닭과 첫 공백에서 입력이 끊긴 문제를 이번 편에서 다시 짚음.
02%s는 \0 앞까지 출력교재 248p
- printf가 %s를 만나면 대응하는 char 배열의 시작 주소부터 문자를 순서대로 출력하고, 널 문자를 만나면 출력을 끝냄.
- %s 자리에 넘기는 것은 대괄호 없는 배열 이름 하나. 몇 글자인지 따로 알려 주지 않아도 \0이 끝을 알려 주는 구조.
03CODE 8.8 — apple 출력교재 248p
- char 배열 fruit를 "apple"로 초기화하고 printf의 %s로 출력하는 예제. fruit는 다섯 글자에 \0 한 칸을 더한 여섯 칸.
- 실행 결과는 과일 문장의 %s 자리에 apple이 들어간 한 줄. a부터 e까지 출력한 뒤 \0을 만나 멈춤. 상세 코드는 교재 CODE 8.8.
04scanf의 %s와 &를 붙이지 않는 까닭교재 248~249p
- scanf도 %s로 문자열을 입력받음. 입력한 문자들은 전달된 char 배열에 차례대로 저장되고, 입력이 끝나면 scanf가 맨 끝에 \0을 자동으로 추가.
- C언어에서 배열의 이름 자체가 배열이 시작되는 메모리 주소를 대표. scanf에는 값을 저장할 주소가 필요한데, 이미 주소인 배열 이름에는 &를 또 붙일 필요가 없음.
- 배열 이름과 주소의 관계는 10장 포인터에서 자세히 다룰 예정.
배열 이름에 &를 붙이지 않음
int 변수를 입력받을 때는 &를 붙이지만, char 배열에 %s로 입력받을 때는 배열 이름만 넘김. 배열 이름이 처음부터 주소를 대표하기 때문이며, 문자 하나를 받는 경우와 혼동하지 않도록 주의.
05CODE 8.9 — 도시 이름 입력과 출력교재 249p
- 크기 20의 char 배열 city를 선언하고, 안내 문구 출력 후 scanf("%s", city)로 입력받아 다시 %s로 출력하는 예제. 널 문자 자리를 빼면 열아홉 글자까지 저장 가능.
- Seoul을 입력하면 결과는 「당신이 가장 좋아하는 도시는 Seoul이군요.」 한 줄. 상세 코드는 교재 CODE 8.9.
06%s 입력의 두 가지 제한점과 8장 마무리교재 249~250p
| 제한점 | 내용 |
|---|---|
| 공백 포함 불가 | 공백·탭·엔터 같은 화이트 스페이스 문자를 만나면 입력 종료. New York을 입력하면 New까지만 읽음 |
| 버퍼 오버플로우 | 배열 크기를 확인하지 않고 메모리에 계속 덮어씀. 비정상 종료나 심각한 보안 문제의 원인 |
char city[10]은 열 글자부터 넘침
10칸 배열에서 한 칸은 \0 몫이므로 담을 수 있는 글자는 아홉까지. 열 글자를 입력하는 순간 이미 배열 밖을 덮어쓰는 상황. 또한 New에서 끊긴 뒤 남은 York은 사라지지 않고 입력 통로에 남아, 뒤에 %s가 더 있으면 그대로 집어 감. 공백까지 한 줄을 받는 방법은 교재 범위를 넘음.
- 8장에서는 1차원 배열의 선언·접근·순회, 2차원 배열과 중첩 반복문, char 배열로 다루는 문자열까지 학습. 다음 9장에서는 코드를 기능 단위로 묶는 함수를 다룸.
이 절의 핵심 정리
- printf의 %s는 char 배열의 시작 주소부터 널 문자를 만날 때까지 문자를 출력한다.
- scanf의 %s로 입력받은 문자열 끝에는 널 문자가 자동으로 추가된다.
- 배열 이름은 그 자체가 배열의 시작 주소를 대표하므로 scanf에서 &를 붙이지 않는다.
- %s 입력은 공백·탭·엔터 같은 화이트 스페이스 문자를 만나면 끝난다.
- scanf는 배열의 크기를 확인하지 않으므로 긴 입력은 버퍼 오버플로우를 일으킬 수 있다.
강의 자료8.3.2 문자열의 입력과 출력
1 / 12
번호를 누르면 해당 장으로 바로 이동합니다 · 방향키 ← → 로도 넘길 수 있습니다

댓글
댓글 쓰기