Presentation is loading. Please wait.

Presentation is loading. Please wait.

2013. 03. 22 컴퓨터 개론 및 실습 강의 6 서울대학교 기계항공공학부 담당 : 김 찬 중.

Similar presentations


Presentation on theme: "2013. 03. 22 컴퓨터 개론 및 실습 강의 6 서울대학교 기계항공공학부 담당 : 김 찬 중."— Presentation transcript:

1 컴퓨터 개론 및 실습 강의 6 서울대학교 기계항공공학부 담당 : 김 찬 중

2 포인터 (Pointer)와 문자열 (string)
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ■ 문자열은 C언어에서 가장 많이 사용되는 배열이다. ■ 문자열 은 그 끝에 ‘\0’ (null character)을 가지므로 실제 기억장소는 따옴표 안에 있는 문자의 갯수보다 한 개가 더 필요하다. ■ 문자열 처리함수는 교과서 p.369 를 참조한다.

3 문자열의 구조 ■ 문자열의 구조 문자열은 항상 ‘\0’ (null character)을 마지막에 가진다. 예를 들어, “hello”는 다섯 글자로 이루어진 문자열이 아니라 와 같이 여섯 글자로 이루어진 문자열이다. ■ 표준 라이브러리 함수 strlen 문자열의 길이를 리턴하는 함수 strlen은 ‘\0’을 제외한 글자수를 리턴한다. 위의 경우 strlen(“hello”) 는 5를 리턴한다. 이것은 와 같이 0부터 5까지의 기억장소 (즉 6개의 기억장소)를 사용하는 것으로 처리하는 것이 훨씬 편리하기 때문이다. h e l o \0 [0] [1] [2] [3] [4] [5]

4 문자열 변수와 문자열 상수 ■ 문자열 변수와 문자열 상수
문자열 변수와 문자열 상수 ■ 문자열 변수와 문자열 상수 문자열 변수와 문자열 상수를 선언하고 초기화(initialization)하는 것은 char msg[] = "Rewrite here" ; // 문자열 변수 const char book[] = "Frozen String" ; // 문자열 상수 와 같이 큰 따옴표로 이루어진 상수 문자열을 이용한다. ■ 문자열의 원소(즉, 문자)에의 접근 문자열은 하나의 배열이므로 msg[i], *(book+i) 와 같이 포인터를 이용하여 각 문자에 접근한다. book[0] = '1'; // error C2166: l-value specifies const object 와 같이 문자열 상수의 값을 바꾸는 것은 불가능한다.

5 문자열 함수 strlen (std library)
/* strlen : return length of s */ int strlen(char *s) { char *p = s; // 포인터 p를 이용하여 문자를 검색 while( *p ) ++p; // null 문자 ‘\0’을 만나면 종료 return p - s; } p ++p *p == 0 \0 s[] p가 이 위치에서 while을 빠져나온다

6 문자열 함수 strcpy (std library)
문자열의 복사는 원래의 문자열이 ‘\0’을 만날 때까지 (즉, 거짓일 때까지) 수행된다. ■ 표준 라이브러리 함수 strcpy /* strcpy : copy t to s */ void strcpy(char *s,char *t) { while( *s++ = *t++ ) ; // 포인터 s,t를 이용하여 문자를 복사 } // *s++ = *t++ 는 t 가 증가되기 전의 값 *t 를 먼저 *s 에 복사하고, // t와 s 를 증가시킨다. while( *s++ = *t++ ) ; while( *s = *t ) { s++; t++; } 위의 두 문장은 동일한 내용이다.

7 문자열 함수 strcmp (std library)
문자열의 비교는 각 문자열의 첫 글자부터 시작한다. 두 문자가 같으면 다음 문자로 진행하다가 다른 문자가 나타나면 문자값의 차이로부터 크거나 작은 가를 판단한다. 끝까지 문자가 서로 같으면 0을 리턴한다. ■ 표준 라이브러리 함수 strcmp /* strcmp : return < 0 if s<t, 0 if s==t, >0 if s>t */ int strcmp(char *s,char *t) { for( ; *s == *t; s++, t++) // 포인터 s,t를 이용 if( *s == '\0' ) return 0; return *s - *t ; } strcmp(“abc”, “abx”) 는 음의 정수 strcmp(“abc”, “abc”) 는 0 strcmp(“abc”, “aba”) 는 양의 정수

8 문자열 함수 strcat (std library)
/* strcat : concatenate t to end of s; s must be big enough*/ void strcat(char *s,char *t) { s += strlen(s); while( *s++ = *t++ ) ; // 포인터 s,t를 이용 } char s[100] = “abc”; strcat( s, “xyz” ) ; printf( “%s\n”, s ); abcxyz

9 문자열 함수 atoi (std library)
문자열 “365”를 정수 365로 변환하려면 atoi(“365”) 와 같이 표준 함수 atoi 를 이용한다. 단, #include <stdlib.h> 문장을 포함해야 한다. ■ 표준 라이브러리 함수 atoi /* atoi : convert s to integer */ int atoi(char *str) { char *p = str; int n = 0,sign; while( *p == ' ' ) { ++p; } // skip space sign = (*p == '-') ? -1 : 1 ; if( *p == '+' || *p == '-' ) ++p; // skip sign while( *p ) { n = 10*n + (*p - '0'); ++p; } return sign*n; }

10 문자열 함수 atof (std library)
문자열 “ ”를 실수 로 변환하려면 atof(“ ”) 와 같이 표준 함수 atof 를 이용한다. 단, #include <stdlib.h> 문장을 포함해야 한다. ■ 표준 라이브러리 함수 atof /* atof : convert s to double */ double atof(char *p){ double sign,val,power; while( *p == ' ' ) ++p; // skip space sign = (*p == '-') ? -1. : 1. ; // find sign if( *p == '+' || *p == '-' ) ++p; // skip sign for(val = 0.; *p>='0' && *p<='9'; p++) val = 10.*val + (*p - '0'); if( *p == '.' ) p++; for(power = 1.; *p>='0' && *p<='9'; p++) { // for x < 1 val = 10.*val + (*p - '0'); power *= 10.; } return sign*val/power;

11 ★ ★ ★ ★ ★ ★ 문자열 함수 strrev \0 p ++p --q q ■ 사용자 함수 strrev
/* strrev : reverse string str in place */ void strrev(char *str) { char *p = str, *q, c; q = p + strlen(p) -1; // last character, next is ‘\0’ while( p < q ) { c = *p; *p = *q; *q = c; // swap *p and *q ++p; --q; // forward and backward } p ++p --q q \0

12 문자열 함수 itoa 정수(-365)를 문자열(“-365”)로 변환하는 것은 먼저 1의 자리부터 시작하여 마지막 자리까지 “563-”와 같이 역순으로 만들고, 문자열을 뒤집는 방법을 사용한다. ■ 사용자 함수 itoa /* itoa : convert n to characters in s */ void itoa(int n,char *p) { int sign = n; char *str = p; if( n < 0 ) n = -n; // make positive do { *p = n % 10 + '0'; p++; // get next digit } while( (n/=10) > 0 ); // delete digit if( sign < 0 ) { *p = '-'; p++; } *p = '\0'; strrev(str); }

13 문자열 함수 strtrim 문자열에 마지막에 “공백, 탭, 줄바꿈” 등의 문자가 오지 않도록 잘라내는 함수를 작성해보자
/* strtrim : remove trailing blanks, tabs, newlines */ int strtrim(char *str) { char *p; for(p = str+strlen(str)-1; p >= str; p--) if( *p != ' ' && *p != '\t' && *p != '\n' ) break; *(++p) = '\0'; return p-str; // string length }


Download ppt "2013. 03. 22 컴퓨터 개론 및 실습 강의 6 서울대학교 기계항공공학부 담당 : 김 찬 중."

Similar presentations


Ads by Google