• 검색 결과가 없습니다.

4강. 배열로 문자열 처리하기

N/A
N/A
Protected

Academic year: 2022

Share "4강. 배열로 문자열 처리하기"

Copied!
11
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

C 언어 포인터 정복하기

TAE-HYONG KIM

COMPUTER ENG, KIT

4강. 배열로 문자열 처리하기

(2)

학습 내용

 문자열은 어디에 저장할까?

 문자열은 어떻게 입력 받을까?

 배열로 문자열 다루기

 함수로 문자열 처리하기

2

(3)

문자열의 특징

 문자열(상수)의 출력

 문자열은 별도 자료형을 갖지 않는다

• 문자열은 문자형의 연속(배열형태)이다

 문자열은 어떻게 저장될까?

 문자열(상수)의 맨 마지막에는 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’

(4)

문자열을 저장하자

 문자열 상수는 내용을 바꿀 수 없다

 문자열 저장을 위해 문자배열을 사용한다

 문자 배열에 문자열을 저장하는 방법

 방법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”;

(5)

문자열을 저장하자 (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(저장공간 문자배열, 저장 문자열(배열))

(6)

문자열은 어떻게 입력받을까?

 충분한 공간의 문자배열 필요

 NULL 문자까지 계산해야 한다

 문자배열에 사용자 입력 문자열 저장하기

 방법1. scanf() 사용

• 배열에 입력 문자열 뒤에 NULL 문자가 자동으로 입력됨

• ‘엔터’가 입력될 때까지 입력, 개행문자는 버퍼(stdin)에 남아있음

• 다음에 오는 입력함수(scanf() 등)에 영향을 미침

6

char PRID[15]; // 주민등록번호를 위한 최소공간

printf(“주민등록번호를 입력하세요: ”);

scanf(“%s”, PRID); // 배열의 이름만 사용

fflush(stdin); // stdin 버퍼를 비워줌

(7)

문자열은 어떻게 입력받을까? (2)

 문자배열에 사용자 입력 문자열 저장하기

 방법1. scanf() 사용

• 또다른 문제점: 처음 공백문자(‘ ’ 등) 전까지만 저장됨

• 키보드로 “hello world”입력 시 배열에 “hello”만 저장됨

 방법2. 문자열전용함수(gets() 등) 사용

• ‘엔터’ 입력되기 전까지의 모든 문자가 배열에 저장됨

• 개행문자는 stdin 버퍼에서 제거됨 (fflush() 필요없음)

• 입력문자열 맨 뒤에 자동으로 NULL 문자 추가됨

• 배열 저장공간 부족 시 오류발생, WHY?

7

printf(“주민등록번호를 입력하세요: ”);

gets(PRID); // 배열의 이름만 사용

fgets(PRID, 15, stdin); //개행문자 저장됨

(8)

배열로 문자열 다루기

패턴 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;

}

(9)

함수로 문자열 처리하기

패턴 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 문자 추가 }

(10)

배열, 이제 충분한가?

 왜 배열을 함수로 넘겨줄 때는 배열의 크기 정보가 사라 질까?

 왜 sizeof(배열이름)을 사용할 때는 배열의 크기정보가 존재할까?

 왜 scanf()로 문자열을 입력받을 때 배열이름만 사용되 며 &는 안 붙을까?

 왜 배열을 함수로 넘겨주어 배열 내용을 변경하면 원래 배열의 내용이 변경될까?

 배열의 정체를 보다 정확히 파악하려면 포인터 개념을 알아야 한다

 C 컴파일러는 배열을 포인터를 이용해 다룬다!

10

(11)

다음 강의 소개

 5강. 포인터의 개념 이해하기

 함수 scanf()를 고민해보자

 포인터가 왜 필요한가?

 포인터는 어떤 정보가 필요한가?

 포인터 구하기

11

참조

관련 문서

그런데 내가 해방이 되어서 고향에 돌아와 보니까, 아니 어디 숨어 있는 줄 알았던 그가 아주 요란스럽게 행세를 하고 있었어.. 바로 교장

We found a high prevalence of elevations of thyroid function and thyroid autoantibodies in adult MMD, especially in ischemic MMD. Although a genetic role and immunologic

실행 중인

이는 오류가 그만큼 줄어들었음을 의미한다..

 Goddard, C.(2005), The Languages of East and Southeast Asia: An Introduction, OUP...

이와 같이 표준용량 두배의 양성자펌프억제제 사용에도 증상이 호전되지 않거나 병변이 개선되지 않는 경우를 난치성 위식 도역류질환(refractory gastroesophageal reflux

② 한국어는 대명사의 사용이 제한된 언어, 대명사가가 발달하 지 않은 언어. 예) 우리 아버지는 강원도에서 태어나셨습니다..

 배열 어댑터는 문자열 집합과 같은 배열로 구성된 데이터 소스를 어댑터뷰와 연관시키기 위한 어댑터.