C 언어 포인터 정복하기
TAE-HYONG KIM
COMPUTER ENG, KIT
4강. 배열로 문자열 처리하기
학습 내용
문자열은 어디에 저장할까?
문자열은 어떻게 입력 받을까?
배열로 문자열 다루기
함수로 문자열 처리하기
2
문자열의 특징
문자열(상수)의 출력
문자열은 별도 자료형을 갖지 않는다
• 문자열은 문자형의 연속(배열형태)이다
문자열은 어떻게 저장될까?
문자열(상수)의 맨 마지막에는 NULL문 자 (‘\0’ , 아스키코드 0번 문자)가 자동으 로 삽입된다.
• 문자열의 끝을 나타낸다, Why?
printf(“%s \n”, “Hello”);
printf(“%u \n”, sizeof(“Hello”));
100 101 102 103 104 105
‘h’
‘e’
‘l’
‘l’
‘o’
‘\0’
문자열을 저장하자
문자열 상수는 내용을 바꿀 수 없다
문자열 저장을 위해 문자배열을 사용한다
문자 배열에 문자열을 저장하는 방법
방법1. 선언과 동시에 저장하기 (배열의 초기화 방법)
• 선언과 동시에 초기화할 때만 가능
4
char str[6]; // “hello” 저장을 위한 공간
char str[6] = {‘h’,‘e’,‘l’,‘l’,‘o’,‘\0’};
char str[] = {‘h’,‘e’,‘l’,‘l’,‘o’,‘\0’};
char str[6] = “hello”;
char str[] = “hello”;
문자열을 저장하자 (2)
문자 배열에 문자열을 저장하는 방법
방법2. 배열의 요소로 각각 저장하기 (반복문 등에 사용)
방법3. 문자열전용 함수로 한번에 저장하기
5
char str[6];
int i;
for (i=0; i<sizeof(str)-1; i++) str[i] = ‘a’+i;
str[i] = ‘\0’; // 문자열 끝 지정 char str[6] = {0}; // 기본 초기화
strcpy(str, “hello”); // <string.h> 필요
// strcpy(저장공간 문자배열, 저장 문자열(배열))
문자열은 어떻게 입력받을까?
충분한 공간의 문자배열 필요
NULL 문자까지 계산해야 한다
문자배열에 사용자 입력 문자열 저장하기
방법1. scanf() 사용
• 배열에 입력 문자열 뒤에 NULL 문자가 자동으로 입력됨
• ‘엔터’가 입력될 때까지 입력, 개행문자는 버퍼(stdin)에 남아있음
• 다음에 오는 입력함수(scanf() 등)에 영향을 미침
6
char PRID[15]; // 주민등록번호를 위한 최소공간
printf(“주민등록번호를 입력하세요: ”);
scanf(“%s”, PRID); // 배열의 이름만 사용
fflush(stdin); // stdin 버퍼를 비워줌
문자열은 어떻게 입력받을까? (2)
문자배열에 사용자 입력 문자열 저장하기
방법1. scanf() 사용
• 또다른 문제점: 처음 공백문자(‘ ’ 등) 전까지만 저장됨
• 키보드로 “hello world”입력 시 배열에 “hello”만 저장됨
방법2. 문자열전용함수(gets() 등) 사용
• ‘엔터’ 입력되기 전까지의 모든 문자가 배열에 저장됨
• 개행문자는 stdin 버퍼에서 제거됨 (fflush() 필요없음)
• 입력문자열 맨 뒤에 자동으로 NULL 문자 추가됨
• 배열 저장공간 부족 시 오류발생, WHY?
7
printf(“주민등록번호를 입력하세요: ”);
gets(PRID); // 배열의 이름만 사용
fgets(PRID, 15, stdin); //개행문자 저장됨
배열로 문자열 다루기
패턴 9 문자열 뒤집어 저장하기
#include <stdio.h>
#include <string.h> // for strlen() int main(void)
{
int i, len;
char ch, str[] = “hello”;
len = strlen(str); // or len = sizeof(str)-1;
for (i=0; i<len/2; i++) { // 중간문자까지 ch = str[i];
str[i] = str[len-1-i]
str[len-1-i] = ch;
}
printf(“reversed str = %s\n”, str);
return 0;
}
함수로 문자열 처리하기
패턴 10 사용자 함수로 strcpy() 기능 구현하기
#include <stdio.h>
void my_strcpy(char [], char []);
int main(void) {
char temp[10], str[10] = “abcde”;
printf(“변경할 문자열을 입력하세요: ”);
fgets(temp, 10, stdin);
my_strcpy(str, temp);
printf(“변경된 문자열 = %s\n”, str);
return 0;
}
void my_strcpy(char dest[], char src[]) // dest[], src[]의 크기는 필요 없음 { // NULL 문자를 통해 계산
int i = 0;
while (src[i] != ‘\0’) { // NULL 문자 전까지 반복 dest[i] = src[i];
i++;
}
dest[i] = ‘\0’; // 마지막에 NULL 문자 추가 }
배열, 이제 충분한가?
왜 배열을 함수로 넘겨줄 때는 배열의 크기 정보가 사라 질까?
왜 sizeof(배열이름)을 사용할 때는 배열의 크기정보가 존재할까?
왜 scanf()로 문자열을 입력받을 때 배열이름만 사용되 며 &는 안 붙을까?
왜 배열을 함수로 넘겨주어 배열 내용을 변경하면 원래 배열의 내용이 변경될까?
배열의 정체를 보다 정확히 파악하려면 포인터 개념을 알아야 한다
C 컴파일러는 배열을 포인터를 이용해 다룬다!