표준 라이브러리는 상당히 다양한 함수를 제공한다. 이 절에서는 그중 자주 쓰이는 것에 대해 설명하였다.

7.8.1 문자열 조작

<stdio.h>에 있는 strlen,strcpy,strcat,strcmp등의 문자열 함수에 대해서는 이미 언급하였다. 다음 예시에서 s는 char *이고 c와 n은 int 이다.

strcat(s,t)      t를 s의 끝에 연결시킨다.

strncat(s,t,n)   t중에 n개 문자를 s의 끝에 연결시킨다.

strcmp(s,t,)     s<t,s==t나 s>t에 대해,-,0,+로 리턴한다.

strncmp(s,t,n)   strcmp와 같은데 단지 처음의 n개의 문자만 비교한다.

strcpy(s,t)      s에 t를 복사한다.

strncpy(s,t,n)   t의 n개 문자를 s에 복사한다.

strlen(s)        s에 길이를 리턴한다.

strchr(s,c)      s에서 첫번째 c의 포인터를 리턴하거나 존재하지 않으면 NULL을 리턴한다.

strrchr(s,c)     s에서 마지막 c의 포인터를 리턴하거나 존재하지 않으면 NULL을 리턴한다.


7.8.2 문자분류와 변환


<ctype.h>의 여러함수는 문자를 검색하거나 변환을 수행한다 다음 c는 unsigned char로 나타낼수 있는 int 거나 EOF이다


isalpha(c)      c가 알파벳이면 0이아닌 숫자,아니면 0

isupper(c)      c가 대문자면 0이아닌 숫자,아니면 0

islower(c)      c가 소문자 0이아닌 숫자,아니면 0

isdigit(c)      c가 숫자(digit)이면 0이아닌 숫자,아니면 0

isalnum(c)      isalpha(c) 거나 isdigit(c)이면 0이아닌 숫자,아니면 0

lsspace(c)      c가 공백,탭,newline,리턴,formfeed,수직탭이면 0이 아닌 숫자

toupper(c)      c는 대문자로 변환된다.

tolower(c)      c는 소문자로 변환된다.


7.8.3 ungetc 함수


표준라이브러리에서는 제 4장에서 제시한 ungetch보다 덜 제한된 형태로 사용되는 ungetc함수가 있다.


int ungetc(int c,FILE *fp)


는 문자 c를 파일 fp에 붙이고 c나 EOF(에러인 경우)중에 하나를 리턴한다. ungetc는 scanf,getc나 getchar와 같은 입력함수의 어떤것과도 함께 사용할수 있다


7.8.4 명령 실행


system(char *s)함수는 무자열 s에 포함된 명령어 라인의 명령(UNIX 명령이나 DOS 명령등)을 실행하고 현재의 프로그램으로 다시 되돌아온다. s의 내용으로 줄수 있는 것은 각각의 운영시스템에 따라 다르다 UNIX시스템의 평범한 예로 명령문


system("date");


는 프로그램 date를 실행시킨다. 이것은 표준 출력에서 그날의 시간과날짜를 출력한다. system은 실행된 명열으로 부터 시스템 의존적인 정수상태(integer status)를 리턴한다.

UNIX시스템에서 상태리턴(status return)은 exit함수가 리턴하는 값이다.


7.8.5 기억장소 관리


malloc와 calloc 함수는 메모리 블록을 동적으로 얻어낸다.


void *malloc(size_t n)


이 함수는 사용 가능한 n바이트를 가리키는 포인터를 리턴하는데 찾을 수 없으면 NULL을 리턴한다.


void *calloc(size_t n,size_t size)


는 지정된 크기의 n개의 대상체(object)의 배열을 위한 충분한 공간의 포인터를 리턴하거나 조건이 만족되지 않으면 NULL을 리턴한다. 저장장소는 0으로 초기화 한다.

malloc나 calloc에 의해 리턴된 포인터는 기억장소 정렬(alignment)에 맞게 되어 있지만, 다음과 같이 cast를 통해 적당한 형 변환을 해 주어야 한다.


int *ip;

ip = (int *)calloc(n,sizeof(int));


free(p)는 malloc나 calloc에 의해 얻어지는 p에 의해 가리켜지는 공간을 자유공간으로 만든다. 기억장소를 자유롭게 하는데는 아무런 순서제한이 없지만 calloc나 malloc 함수에 의존하지 않는 기억장소를 자유공간으로하려면 예상치 못한 에러가 발생된다.

기억장소가 자유공간이 되 후에 이 장소를 그냥 사용하면 에러이다 리스트(list)에서 기억장소를 자유롭게 하기위해 다음과 같은 loop를 사용하면 안된다.


for (p = head; p != NULL; p = p->next) /* WRONG */

    free(p);


다음과 같이 하는 것이 올바른 방법이다.

    

for (p = head; p != NULL; p = q) {

    q = p ->next;

    free(p);

}


8.7에는 malloc와 비슷한 기억장소 할당기(storage allocator)가 소개되어 있는데 이함수는 순서에 관계없이 기억장소를 자유공간으로 만들 수 있다.


7.8.6 수학 함수


<math.h>에는 20가지 이상의 수학적인 함수(mathematical functions)가 있는데 여기서는 자주 사용하는 것을 소개하였다 하나 또는 두개의 double 매개변수를 취해서 double을 리턴한다.


sin(x)     x의 sine,x는 라디안

cos(x)     x의 cosine,x는 라디안

atan2(y,x) y/x의 arctangent,라디안

exp(x)     지수함수 e^x

log(x)     자연로그(x>0)

log10(x)   상용로그(x>0)

pow(x,y)   x^y

sqrt(x)    x의 제곱근(x>=0)

fabs(x)    x의 절대값


7.8.7 난수 발생


rand()함수는 정수형 의사난수(pseudo-random) 0에서 <stdlib.h>에서 정의한 RAND_MAX까지의 범위에서 계산한다. 0보다는 크거나 같고 1보다는 작은 랜덤 부동소수점수를 방생시키는 방법은 다음과 같다.


#define frand() ((double) rand() / (RAND_MAX+1.0))


(만일 라이프러리가 이미 부동 소수점 난수에 대한 함수를 가지고 있다면 위의 것보다 통계상 특성이 더 좋을 것일 수가 많다)

srand(unsigned)함수는 rand함수에게 줄 seed를 세트한다. rand와 srand의 포터블(portable 이식이 자유로운)한 형태의 구현은 2.7에 잘 나타나 있다.


예제 7-9 isupper와 같은 함수는 공백을 절약하거나 시간을 절약하기 위한 형태로 구현이 가능하다 두 가능성을 조사하라.