문자열의 입력과 출력 — printf·scanf의 %s·배열 이름과 주소·버퍼 오버플로우 | 기초 C언어 8.3.2

기초 C언어Chapter 08 배열 › Section 03 문자열과 char 배열

8.3.2 문자열의 입력과 출력

printf와 scanf의 %s로 char 배열 문자열을 출력하고 입력받는 방법. scanf에 배열 이름만 넘기는 까닭과 %s 입력의 두 가지 제한점.

교재 수록 위치
교재
『기초 C언어』 · 이은상 · 부크크 · 364쪽
단원
Chapter 08 배열 › Section 03 문자열과 char 배열 › 문자열의 입력과 출력
쪽수
248p ~ 250p3쪽
세부 내용
문자열 출력하기: printf와 %s · CODE 8.8 · 문자열 입력받기: scanf와 %s · CODE 8.9 · scanf("%s", ...) 사용 시 주의점
학습 목표
%s로 문자열을 출력·입력하는 원리를 이해하고, 공백 입력과 버퍼 오버플로우의 제한점을 구분함
영상 목차 · 원하는 부분부터 보기
  1. 0:00 · 강의 소개와 문자열 입출력
  2. 0:55 · printf의 %s 출력
  3. 3:08 · scanf 입력과 배열 이름
  4. 4:59 · 도시 이름 입출력 예제
  5. 6:40 · 공백과 배열 크기의 제한
  6. 8:58 · 8장 배열 정리

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장에서는 코드를 기능 단위로 묶는 함수를 다룸.

이 절의 핵심 정리

  1. printf의 %s는 char 배열의 시작 주소부터 널 문자를 만날 때까지 문자를 출력한다.
  2. scanf의 %s로 입력받은 문자열 끝에는 널 문자가 자동으로 추가된다.
  3. 배열 이름은 그 자체가 배열의 시작 주소를 대표하므로 scanf에서 &를 붙이지 않는다.
  4. %s 입력은 공백·탭·엔터 같은 화이트 스페이스 문자를 만나면 끝난다.
  5. scanf는 배열의 크기를 확인하지 않으므로 긴 입력은 버퍼 오버플로우를 일으킬 수 있다.
강의 자료8.3.2 문자열의 입력과 출력 1 / 12

번호를 누르면 해당 장으로 바로 이동합니다 · 방향키 ← → 로도 넘길 수 있습니다
다음 절 · 9.1.1 함수의 기초 교재 268p~270p — 특정 작업을 수행하는 코드를 하나로 묶은 함수 ↗

더 자세한 내용은 교재에서

이 글은 『기초 C언어』 248p~250p의 내용을 강의 영상에 맞춰 핵심만 간추린 요약입니다. 각 개념의 상세한 설명과 예제, 실습 코드, 임용시험 기출문제 풀이는 교재에서 다루고 있습니다.

댓글

이 블로그의 인기 게시물

2007년 국가직 9급 기계일반 기출문제 풀이

기계공작법 연습문제 130문 | 임용 기출 영상·교재 쪽수 바로가기