06강의-C언어

Download Report

Transcript 06강의-C언어

1
컴퓨터 개론 및 실습
강의 6
www.msharpmath.com
1
/ 13
2
포인터 (Pointer)와 문자열 (string)
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■ 문자열은 C언어에서 가장 많이 사용되는 배열이다.
■ 문자열 은 그 끝에 ‘\0’ (null character)을 가지므로 실제 기억장소는
따옴표 안에 있는 문자의 갯수보다 한 개가 더 필요하다.
■ 문자열 처리함수는 교과서 p.369 를 참조한다.
www.msharpmath.com
2
/ 13
3
문자열의 구조
■ 문자열의 구조
문자열은 항상 ‘\0’ (null character)을 마지막에 가진다. 예를 들어,
“hello”는 다섯 글자로 이루어진 문자열이 아니라
h
e
l
l
o
\0
와 같이 여섯 글자로 이루어진 문자열이다.
■ 표준 라이브러리 함수 strlen
문자열의 길이를 리턴하는 함수 strlen은 ‘\0’을 제외한 글자수를 리턴한다.
위의 경우 strlen(“hello”) 는 5를 리턴한다. 이것은
[0]
[1]
[2]
[3]
[4]
[5]
와 같이 0부터 5까지의 기억장소 (즉 6개의 기억장소)를 사용하는 것으로
처리하는 것이 훨씬 편리하기 때문이다.
www.msharpmath.com
3
/ 13
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
와 같이 문자열 상수의 값을 바꾸는 것은 불가능한다.
www.msharpmath.com
4
/ 13
5
문자열 함수 strlen (std library)
■ 표준 라이브러리 함수 strlen
/* 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을
빠져나온다
www.msharpmath.com
5
/ 13
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++; }
위의 두 문장은 동일한 내용이다.
www.msharpmath.com
6
/ 13
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”) 는 양의 정수
www.msharpmath.com
7
/ 13
8
문자열 함수 strcat (std library)
문자열을 이어붙이는 표준함수 strcat을 포인터를 이용하여 작성해보자.
■ 표준 라이브러리 함수 strcat
/* 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
www.msharpmath.com
8
/ 13
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;
}
www.msharpmath.com
9
/ 13
10
문자열 함수 atof (std library)
문자열 “-3.14159”를 실수 -3.14159로 변환하려면 atof(“-3.14159”) 와 같이 표준
함수 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++) {
val = 10.*val + (*p - '0');
power *= 10.;
}
return sign*val/power;
// for x < 1
}
www.msharpmath.com
10
/ 13
11
문자열 함수 strrev
■ 사용자 함수 strrev
/* strrev : reverse string str in place */
void strrev(char *str)
{
char *p = str, *q, c;
q = p + strlen(p) -1;
while( p < q ) {
c = *p; *p = *q;
++p; --q;
}
// last character, next is ‘\0’
*q = c;
// swap *p and *q
// forward and backward
}
p
++p
--q
q
★ ★ ★ ★ ★ ★
www.msharpmath.com
\0
11
/ 13
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);
}
www.msharpmath.com
12
/ 13
13
문자열 함수 strtrim
문자열에 마지막에 “공백, 탭, 줄바꿈” 등의 문자가 오지 않도록 잘라 내는 함수를
작성해보자
■ 사용자 함수 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
}
www.msharpmath.com
13
/ 13