Presentation is loading. Please wait.

Presentation is loading. Please wait.

처음으로 배우는 C 프로그래밍 제4부 복합 데이터 형 제 9 장 문자열.

Similar presentations


Presentation on theme: "처음으로 배우는 C 프로그래밍 제4부 복합 데이터 형 제 9 장 문자열."— Presentation transcript:

1 처음으로 배우는 C 프로그래밍 제4부 복합 데이터 형 제 9 장 문자열

2 9.1 문자열의 기초 문자열 (string) T h i s i s a s t r i n g \0
9.1 문자열의 기초 문자열 (string) 이중 인용부호로 묶여진 문자들의 나열 예) “This is a string” “Hello World” “xyz 문자열의 끝을 표시하는 널 문자(\0)가 맨 끝에 첨가된 문자들의 배열 인용 부호는 저장되지 않음 예) “This is a string”의 메모리 저장 형태 T h i s i s a s t r i n g \0

3 9.1 문자열의 기초 Input Output Program 9-1: 실행 결과 : Enter a string:
9.1 문자열의 기초 문자열의 입력과 출력 문자열의 입/출력을 위하여 미리 정의된 함수들 (라이브러리) 사용 위의 함수를 이용하기 위하여 헤더 화일에 <stdio.h>를 포함시켜야 함 Input Output gets() puts() scanf() printf() getchar() putchar() #include <stdio.h> void main(void) { char message[81]; printf(“Enter a string : \n”); gets(message); printf(“The string just entered is : \n”); put(message); } 실행 결과 : Enter a string: This is a test input of a string of characters. The string just entered is : Program 9-1:

4 9.1 문자열의 기초 characters\n gets() characters\0
9.1 문자열의 기초 gets()와 puts()의 성질 입출력 함수들의 비교 puts(message) 는 printf(“%s\n”, message)와 동일함 gets(message)는 scanf(“%s”, message)와 차이가 있음 scanf() 함수는 공백이나 개행 문자가 입력될 때까지만 입력함 gets() 함수는 개행 문자가 입력될 때까지 입력함 예) “this is a string”을 입력하는 경우 scanf ( “%s %s %s %s” message1, message2, message3, message4); characters\n gets() characters\0 characters\0 puts() characters\n

5 9.1 문자열의 기초 배열 처리방식을 이용한 문자열의 처리 예) 문자열 string2의 내용을 string1으로 복사하는 함수 void strcopy (char string1[], char string2[] ) { /* 두 개의 배열이 전달됨 */ int i = 0; /* i는 첨자로 사용됨 */ while (string2[i] != ‘\0’) { /* 문자열의 끝을 검사함 */ string[i] = string2[i]; /* string1으로 내용을 복사함 */ ++i; } string1[i] =‘\0’; /* string1에 문자열 끝 표시를 함 */ return; #include <stdio.h> void main(void) { char message[81]; char new_mess[81]; int i; void strcopy (char [], char [] ) printf(“Enter a sentence:”); get(message); strcopy(new_mess, message); put(new_mess); } 결과 : Enter a sentence: How much wood could a woodchuck chuck. How much wood would a woodchuck chuck.

6 9.1 문자열의 기초 문자단위의 입출력 Enter a string:
9.1 문자열의 기초 문자단위의 입출력 #include <stdio.h> void main(void) { char message[81]; int i; void getline(char []); printf(“Enter a string: \n”); getline(message); printf(“The string just entered is : \n”); put(message); } void getline ( char string[ ] ) { int i = 0 ; char c; while ( i < 80 && (c = getchar( ) ) !=‘\n’ ) { string [i] = c; i++ } string [i] = ‘\0’; return; Enter a string: This is a test input of a string of characters. The string just entered is :

7 9.2 포인터와 라이브러리 함수 문자열에서 첨자와 포인터 사용
9.2 포인터와 라이브러리 함수 문자열에서 첨자와 포인터 사용 문자열을 다룰 때 첨자 표기법 대신에 포인터를 사용하면 프로그램이 더욱 간결해지고 효율적으로 작성됨 예) 포인터를 사용하여 strcopy() 함수의 재작성 void strcopy (char string1[], char string2[] ) /* 버전 1 */ { int i = 0; while ( string2[i] ) { string1[i] = string2[i] ; ++i; } string1[i] = ‘\0’; return; void strcopy (char string1[], char string2[] ) /* 버전 2*/ { int i = 0; while ( string1[i] = string2[i] ) ++i; return; }

8 9.2 포인터와 라이브러리 함수 포인터를 사용하여 재작성
9.2 포인터와 라이브러리 함수 포인터를 사용하여 재작성 void strcopy ( char *string1, char *string2 ) /* 버전 3 */ { while ( *string1 = *string2 ) { string1++; string2++; } return; void strcopy ( char string1, char string2 ) /* 버전 4 */ while ( *string1 ++ = *string2 ++) ; 지시된 문자는 포인터가 증가되기 전에 접근되고, 지정문 *string1 = *string2 이 실행된 후에 포인터들이 증가되어 다음 문자를 올바르게 지시한다.

9 9.2 포인터와 라이브러리 함수 테이블 9-2 : 배열과 문자 라이브러리 함수와 루틴 Name Description
9.2 포인터와 라이브러리 함수 테이블 9-2 : 배열과 문자 라이브러리 함수와 루틴 Name Description strcat(string1, string2) string2의 내용을 string1에 붙인다 strchr(string,character) string 내에서 character가 처음 발생한 곳을 찾아서 그 위치 (주소)를 리턴한다. strcmp(string1, string2) string1과 string2를 비교한다. strcpy(string1, string2) string2를 string1에 복사한다. strlen(string) string의 길이를 리턴한다 isalpha(character) character가 알파벳이면 0이 아닌 수를 반환하고, 알파벳이 아니면 0을 반환한다 isupper(character) character가 대문자이면 0이 아닌 수를 반환하고, 대문자가 아니면 0을 반환한다 islower(character) character가 소문자이면 0이 아닌 수를 반환하고, 소문자가 아니면 0을 반환한다 isdigit(character) character가 숫자(0에서 9까지)이면 0이 아닌 수를 숫자가 아니면 0을 반환한다 toupper(character) character가 소문자이면 대문자로 변환시키고, 그렇지 않으면 그 값을 그대로 반환한다 tolower(character) character가 대문자이면 소문자로 변환시키고,

10 9.3 문자열 정의와 포인터 배열 Theis is a string \0 Theis is a string \0
문자열 정의와 포인터 상수의 자동 생성 문자열을 정의하면 원소 수 만큼의 기억장소와 함께 시작 주소를 저장하는 하나의 포인터 상수 (문자열 배열의 이름과 동일함)를 생성함 예) static char message1[81]을 정의하면 - 81 개의 문자열을 저장하는 공간 확보 - message1[0]의 주소 값을 가지는 포인터 상수 message1을 생성 - 포인터 상수 message1은 변할 수 없음 포인터를 이용한 문자열의 생성 예) char message1[81] = “This is a string”; char *message2 = “This is a string”; Theis is a string \0 message1==&message1[0]: 상수 Theis is a string \0 message2 : 변수

11 9.3 문자열 정의와 포인터 배열 포인터를 사용한 문자열 생성의 예제 #include <stdio.h>
void main(void) { char message2 = “this is a string”; printf(“\n The string is : %s”, message2); printf(“\n The first address of this string is %p”, message2); message2 = “A new message”; printf(“\n The string is now : %s”, message2); } 결과 : The string is: this is a string The first address of this string is 009E The string is now: A new message The first address of this string is 00EB 주의 : message2에 지정된 두 번째 문자열이 첫번째 문자열을 덮어 쓰지 않는다. 즉, 새로운 문자열을 가리키기 위해 message2 안에 있는 주소 만을 바꾼다. (그림 9-6 참고)

12 9.3 문자열 정의와 포인터 배열 포인터 배열 seasons[0] seasons[1] seasons[2] seasons[3]
문자(열)에 대한 포인터를 원소로 하는 배열 예) char *seasons[4]; seasons[0] = “Winter”; seasons[1] = “Spring”; seasons[2] = “Summer”; seasons[3] = “Fall”; [프로그램 9-6] : #include<stdio.h> void main(void) { int n; char *seasons[] = “”Winter”, “Spring”, “Summer”, “Fall”} ; for (n=0; n<4; ++n) printf(“The season is %s.”, seasons[n]); } result: The season is Winter. The season is Spring. The season is Summer. The season is Fall. Winter\0 Spring\0 Summer\0 Fall\0 seasons[0] seasons[1] seasons[2] seasons[3] < 메모리 구조 >

13 9.3 문자열 정의와 포인터 배열 포인터 배열의 잇점 [프로그램 9-7]:
문자열들을 하나의 그룹으로 묶어서 관리할 수 있으며, 사용자는 첨자의 조정만으로 문자열들을 간편하게 관리할 수 있음 예) [프로그램 9-7]: #include<stdio.h> void main(void) { int n; char *seasons[] = “”Winter”, “Spring”, “Summer”, “Fall”} ; printf(“Enter a month (use 1 for Jan., 2 for Feb., etc.):”); scanf(“%d”, &n); n = (n%12) / 3; printf(“The month entered is a %s month.”, seasons[n]); } 결과 : Enter a month (use 1 for Jan., 2 for Feb., etc.) : 12 The month entered is a Winter month.

14 9.4 형식 문자열 필드의 폭 지정자 (field width specifier)
예) “Have a Happy Day”를 폭 25의 필드에 출력 printf(“|%25s|”, “Have a Happy Day”); => | Have a Happy Day| printf(“|%25s|”, “Have a Happy Day”); => |Have a Happy Day | printf(“|%25.12s|”, “Have a Happy Day”); /* 폭 25, 처음 12개 문자 를 오른쪽으로 붙여서 출력*/ => | Have a Happy| printf(“|%  25.12s|”, “Have a Happy Day”); => |Have a Happy |

15 9.4 형식 문자열 메모리 안에서의 문자열 변환 표준 입출력 장치 대신에 메모리의 변수에 값을 입력하거나 메모리 변수의 값을 출력함 예) spintf(), sscanf() sprintf(dis_strn, “%d %d”, num1, num2); sscanf(data, “%c%lf %d”, &dol, &price, &units); $ 이라는 값이 data라는 이름의 문자 배열안에 있었다면, dol에는 $ price에는 23.45 unit에는 10이 저장됨

16 9.4 형식 문자열 형식 문자열 (format string)
printf(), scanf(), sprintf(), sscanf() 함수에는 형식(제어) 문자열이 사용되어 문자열의 형식을 제어함 예) printf(“$%5.2f %d”, num1, num2);를 부르는 함수 안에 포함되는 제어 문자열 “$%5.2f %d”는 그 자체로 문자열로서 저장될 수 있고, 문자열의 주소는 printf()에 대한 호출(call)에서 사용될 수 있다. 만약 fmat에 대한 다음과 같은 선언들 중의 하나가 생성된다면: char *fmat = “%5.2f %d”; 혹은 char fmat[] = “$%5.2f %d”; printf(fmat, num1, num2);는 printf(“$%5.2f %d”, num1, num2);와 동일하게 처리된다. <= 형식 문자열을 한번 정의한 후 여러곳에서 사용하는 경우 형식 문자열의 정의만 바꾸면 그것을 사용하는 모든 printf(), scanf(), sprintf(), sscanf()의 형식 문자열이 자동으로 변경된다 (수정 용이)

17 9.5 자주 발생하는 에러들 존재치 않는 요소를 지시하기 위해 포인터를 사용하는 경우 널문자 고려 용어의 오해
C 컴파일러는 배열의 첨자와 마찬가지로 포인터의 범위 체크를 수행하지 않기 때문에 포인터 주소의 유효함은 사용자가 보장해야 함 널문자 고려 문자열의 끝 원소인 널문자를 고려하지 않은 문자열 크기를 지정하는 경우 용어의 오해 만약 text가 다음과 같이 정의된 경우에 변수 text를 문자열이라고 부름 char *text; 때문에 “Hooray for the Hoosiers”라는 문자들을 text 문자열에 저장하라고 명령할 수 있음 엄격히 말하면, 문자열 text나 문자열 변수 text라고 부르는 것은 틀린 것이다. 실제로 변수 text는 문자열에 있는 첫번째 문자의 주소를 포함하는 포인터이기 때문이다.

18 9.6 요 약 1. 하나의 문자열은 널(null)문자에 의해서 끝나는 문자들의 배열이다.
2. 문자열들은 표준 배열 처리(array-processing) 기법을 사용해서 처리될 수 있다. 3. 문자열 입력에 gets(), scanf(), getchar() 등의 라이브러리 함수들을 사용한다. scanf() 함수는 공백이 입력될 때 입력을 끝내므로 주의하여 사용해야 한다. 4. 문자열을 출력하기 위해 puts(), printf(), putchar() 등의 함수는 사용한다. 5. 배열의 첨자 대신 포인터 표기법과 포인터 연산을 사용하여 복수개의 문자열을 편리하게 다룰 수 있다. 6. 문자열을 편리하게 다루기 위하여 표준 라이브러리 함수들이 제공된다. 내부적으로 이러한 함수들은 포인터를 사용해서 문자 단위(character-by-character manner)로 변환되어 처리된다. 7. 문자열에 대한 기억장소는 문자열 배열이나 문자에 대한 포인터를 선언해서 생성할 수 있다. 문자에 대한 포인터에는 문자열을 할당(assign)할 수 있다. 문자열의 배열에 대한 문자열 할당은 선언문 안에 있을 때를 제외하고 사용할 수 없다. 8. 배열은 다음과 같은 형식의 문자열 할당을 사용해서 초기화 될 수 있다. char *arr_name[] = “text”; char *arr_name[] = {‘t’, ‘e’, ‘x’, ‘t’, ‘\0’};


Download ppt "처음으로 배우는 C 프로그래밍 제4부 복합 데이터 형 제 9 장 문자열."

Similar presentations


Ads by Google