2013. 6. 20. 10:25ㆍProgramming/C
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
종종 들어가야지~