본문 바로가기
Programming/C

[C] C에서 문자열 처리

by 유주원 2013. 6. 20.

C에서 프로그래밍 시 C++이나 JAVA, C#과는 다르게 문자열 처리하는 방식에 대해 일반적으로 포인터를 이동해서 캐릭터 단위로 처리하는 방식으로 많이 구현해왔다.

C에서도 문자열 처리하는 함수가 있는데 굳이 이렇게 날코딩 해야하나~~~

그래서 C에서의 문자열 처리 함수에 대해 알아보기로 했다.

우선.. 문자열에 해당 문자가 포함되어 있는지를 알기 위한 함수.

char* strstr(const char* 대상 문자, const char* 찾고자하는 문장)

사용 방법은 다음과 같다.

char *str = "test program";

char *find = strstr(str, "pro");

만약 해당하는 문자열이 검색이 안될 시 find 값은 NULL을 나타내게 되어 있으며, 해당 NULL을 이용하여 exception 처리를 하면 된다.

하지만 난 파일 확장자를 찾기 위해서 문자열 뒤에서부터 검색하고 싶다고.. 

찾아보니 다음과 같은 함수가 있다.

char* strrchr(const char* 대상 문자, int 찾고자하는 문자)

어라.. strstr과는 다르게 char*가 아니고 int네.. 

문자 1바이트만 찾을수 있다는 소리 같다.

어쨌든 사용 방법은 다음과 같다.

char *str = "test.fileextension.txt";

char *find = strrchr(str, '.');

strstr과 동일하게 해당 문자를 찾지 못했을 경우 find는 NULL을 가리키게 된다.

그 밖의 C에서의 문자열 처리 함수들을 나열해봤다. 물론 <string.h> 선언 필요..

int strcasecmp(const char* s1, const char* s2)

대소문자를 무시하고 2개의 문자열을 비교.

같으면 0, 같지 않으면 그 외의 수 리턴.

int strncasecmp(const char* s1, const char* s2, size_t n) 

대소문자를 무시하고 2개의 문자열을 지정한 문자 개수까지만 비교.

같으면 0, 같지 않으면 그 외의 수 리턴.

char* strcpy(char* dest, const char* src)

dest 메모리에 src 문자열을 복사하며 복사된 결과 값을 리턴.

char* strncpy(char* dest, const char* src, size_t n)

src 문자열을 지정한 길이 만큼만 dest에 복사하며 복사된 결과 값을 리턴.

char* strdup(const char* str)

복사할 문자열 크기의 메모리를 할당한 후, 문자열을 복사하며 복사된 결과 값을 리턴.

strcpy는 메모리를 할당한 후 파라미터로 넘기지만, strdup는 내부적으로 메모리를 할당한다는 차이가 있음.

size_t strlen(const char* str)

문자열의 길이를 리턴.

char* strchr(const char* str, int chr) 

찾고자 하는 문자가 발견된 첫 번째의 포인터를 리턴. 

char* strrchr(const char* str, int chr)

찾고자 하는 문자가 발견된 마지막 위치의 포인터를 리턴.

char* strstr(const char* str1, const char* str2)

찾고자 하는 문자열이 발견된 첫번째 위치의 포인터를 리턴.

strchr과의 차이점은 문자와 문자열의 차이임.

size_t strspn(const char* s1, const char* s2)

문자열에서 특정 문자가 포함된 문자열의 길이를 구함.

ex) strspn("testprogram", "abcdeft")

위와 같이 입력하면 t,e,s,t는 모두 "abcdeft"안에 포함되는 문자들이다. 

그러나 p는 해당되지 않기 때문에 test의 길이만 리턴하므로 4를 리턴한다. 

size_t strcspn(const char* s1, const char* s2) 

문자열에서 특정 문자가 포함되지 않은 문자열의 길이를 구함.

strspn과 정반대의 기능을 하는 함수라고 생각하면 됨.

char* strpbrk(const char* s1, const char* s1)

문자열에서 지정된 문자들이 있는 위치의 포인터를 리턴한다.

strspn이 길이를 리턴하는 것이라면 strpbrk는 해당 포인터를 리턴한다고 생각하면 된다.

char* strtok(char* s1, const char* s2)

문자열을 문자로 자르는 함수. 

해당 자르기 함수를 실행할 때마다 선두 번지의 포인터가 리턴됨.

ex) "test program is nice"를 자르기를 할 경우,

-> 첫 번째 strtok 시도. strtok(str, " ") => test 리턴.

-> 이 후부턴 strtok(NULL, " ") 호출하면 program 리턴.

-> strtok(NULL, " ") 호출. is 리턴.

-> strtok(NULL, " ") 호출. nice 리턴.

strtok 함수를 사용하면 해당 자른 문자열 뒤에 NULL 문자가 추가로 붙기 때문에 원본 문자열이 깨진다.

char* strcat(char* dest, const char* src) 

두 개의 문자열을 받아 1개의 문자로 합침.

합쳐질 때엔 첫번째 메모리에 합쳐지기 때문에 첫번째 인수의 메모리는 두 문자열 크기만큼 확보되어야 한다. 

char* strncat(char* dest, const char* src, size_t n)

두 개의 문자열을 받아 첫번째 문자열에 지정된 길이 많큼 두번째 문자를 합침. 

int strcmp(const char* s1, const char* s2)

두 개의 문자열을 비교함. 문자열의 길이 비교가 아니라 ASCII 값 비교임. 

두 개의 문자열이 같으면 0

첫 번째 문자열이 크면 0보다 큰 값

두 번째 문자열이 크면 0보다 작은 값이 리턴된다.

int strncmp(const char* s1, const char* s2, size_t n)

두 개의 문자열을 지정된 길이만큼만 비교함.

리턴 값은 strcmp와 같다. 


참고로 C언어 강좌가 잘 되어 있는 사이트를 발견했다.

http://forum.falinux.com/zbxe/index.php?mid=gcc

종종 들어가야지~