다시 복습하네요. String 함수의 return 값들도 중요한 것 같네요.
함수 | 설명 |
---|---|
복사 | |
void * memcpy ( void * destination, const void * source, size_t num ); | source가 가리키는 곳 부터 num바이트 만큼을 destination이 가리키는 곳에 복사한다. |
void * memmove ( void * destination, const void * source, size_t num ); | source가 가리키는 곳 부터 num바이트 만큼을 destination이 가리키는 곳으로 옮긴다. |
char * strcpy ( char * destination, const char * source ); | source를 destination에 복사한다. |
char * strncpy ( char * destination, const char * source, size_t num ); | source에서 destination으로 처음 num개의 문자들을 복사한다. |
병합 | |
char * strcat ( char * destination, const char * source ); | source를 destination뒤에 붙인다. |
char * strncat ( char * destination, char * source, size_t num ); | source에서 destination뒤에 처음 num개의 문자들을 붙인다. |
비교 | |
int memcmp ( const void * ptr1, const void * ptr2, size_t num ); | ptr1이 가리키는 처음 num바이트의 데이터와 ptr2가 가리키는 처음 num바이트의 데이터를 비교한다. |
int strcmp ( const char * str1, const char * str2 ); | str1과 str2를 비교한다. |
int strcoll ( const char * str1, const char * str2 ); | strcmp와 비슷하지만 LC_COLLATE에 정의되어 있는 방식에 따라 해석 된 후 비교한다. |
int strncmp ( const char * str1, const char * str2, size_t num ); | str1의 처음 num개의 문자를 str2의 처음 num개의 문자와 비교한다. |
size_t strxfrm ( char * destination, const char * source, size_t num ); | source를 현재 지역 정보에 따라 문자열을 변환한 후 변환한 문자열의 처음 num개 문자를 destination에 복사한다. |
탐색 | |
void * memchr ( const void * ptr, int value, size_t num ); | ptr이 가리키는 메모리의 처음 num바이트 중에서 처음으로 value와 일치하는 값(문자)의 주소를 반환한다. |
char * strchr ( const char * str, int character ); | str에서 처음으로 character와 일치하는 문자의 주소를 반환한다. |
size_t strcspn ( const char * str1, const char * str2 ); | str2에 들어있는 문자들 중 str1에 들어있는 문자와 일치하는 것이 있다면 첫 번째로 일치하는 문자까지 읽어들인 수를 반환한다. |
char * strpbrk ( const char * str1, const char * str2 ); | str1에서 str2에 들어 있는 문자들을 찾아 str2의 문자들 중 str1의 문자들과 첫 번째로 일치하는 문자의 주소를 반환한다. |
char * strrchr ( const char * str, int character ); | str에서 마지막으로 character와 일치하는 문자의 주소를 반환한다. |
size_t strspn ( const char * str1, const char * str2 ); | str2의 문자들만을 포함하고 있는 str1의 처음 부분의 길이를 구한다. |
char * strstr ( const char * str1, const char * str2 ); | str1에서 str2를 검색하여 가장 먼저 나타나는 곳의 위치를 반환한다. |
char * strtok ( char * str, const char * delimiters ); | str1을 delimiters의 문자들로 분리한다. |
기타 | |
void * memset ( void * ptr, int value, size_t num ); | ptr이 가리키는 메모리의 처음 num바이트를 value값(문자)으로 채운다. |
char * strerror ( int errnum ); | errnum(보통 errno)을 해석한 뒤 그에 해당하는 에러 문자열의 포인터를 반환한다. |
size_t strlen ( const char * str ); | str의 길이를 반환한다. |
https://ko.wikipedia.org/wiki/String.h
1. strtok, strpbrk
저는 이 두 함수를 자주 사용하지 않는 함수지만 Parsing 할때 아주 유용하게 사용할 수 있을 것 같다. 사용법은 아주 유사하기에 비교하면 설명하겠다.
- fixxed string size 차이
char[] = "stirng2"; // 변경 가능
- strtok
1st는 source이고, delimiter에 구분하고자 하는 문자들을 string 형태로 넣는다.,
strtok는 source에서 delimiter를 NULL 변경하는 작업이다.
한번 호출할 때마다 , 한번식 delimiter를 NULL로 변경하고, 하나의 string 이 생긴다.
그래서 return이 NULL이 될 때까지 호출을 하면 모두를 변경하고 나오는 것이다.
1st string 대신 NULL 값을 넣으면, 그전에 사용하시던 source pointer 를 값을 기억한다.
- strpbrk
동일하다고 생각하고 , delimiter들의 위치만 알려준다고 생각하면 되겠다. .
delimiter를 제거하기위해 항상 pointer에 +1를 해줘야 한다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <string.h> | |
int getStrlens(char str[]) | |
{ | |
int cnt=0; | |
while(str[cnt] !='\0') | |
cnt++; | |
return cnt; | |
} | |
int main(void) { | |
int lens1,lens2; | |
char *str1="123456789"; // only read | |
char str2[]="my name is jeong *hun lee this-is*number 123-4568"; // read, writable | |
char str3[]="my name is jeong *hun lee this-is*number 123-4568"; // read, writable | |
char *ptr; | |
lens1 = getStrlens(str1); | |
lens2 = strlen(str1); | |
printf("strlens %d , %d \n",lens1,lens2); | |
//*(str1+1)=0; if you changed , error | |
/* 1. check str2 and delimeters | |
2. replaced only one charater in str2 with one of the delimeters | |
3. made 1st word and return 1st word | |
*/ | |
printf("TEST1 strtok ----------------------\n"); | |
ptr = strtok( str2, " *-"); | |
do{ | |
printf( "%s\n",ptr); | |
/* 1. check NULL and delimeters, NULL means same string. | |
2. replaced only one charater in str2 with one of the delimeters | |
3. made it 2nd word and return 2st word | |
*/ | |
}while( (ptr=strtok( NULL, " *-")) ); | |
/* | |
str2 was replaced with delimeters so it's different string | |
strtok changed NULL instead of delimeter | |
*/ | |
printf( "%s\n",str2); | |
printf("TEST2 strpbrk ----------------------\n"); | |
ptr = strpbrk( str3, " *-"); | |
do{ | |
printf("[%c]",*ptr); | |
printf("%s\n",(ptr+1)); | |
}while( (ptr=strpbrk( ptr+1, " *-")) ); | |
return 0; | |
} |
https://www.tutorialspoint.com/c_standard_library/c_function_strpbrk.htm
댓글 없음 :
댓글 쓰기