[C언어] str로 시작하는 문자열 함수 -2 | strtok, strtok_r, strspn, strcspn, strdup
2024. 5. 23. 21:25ㆍC언어
반응형
기본적인 문자열 복사, 비교, 검색 등의 str 함수들은 1편에
[C언어] str로 시작하는 문자열 함수 -1 | strcpy, strcat, strchr, strlen, strcmp, strstr
C언어에서 'str' 로 시작하는 함수들은 문자열 처리를 위해 자주 사용되는 함수이며, 이 함수들은 표준 라이브러리 에 정의되어있다. 이번 글에서는 문자열을 복사, 비교, 검색과 길이 계산의 작
wolleyneerg.tistory.com
1. strtok
- 문자열을 특정 구분 문자(토큰)로 분리.
- 토큰을 찾을 수 없으면 NULL 반환.
char *strtok(char *str, const char *delim);
int main() {
char str[] = "Hello, World! Welcome to C programming.";
char *token;
// 첫 번째 호출에서 분할할 문자열을 전달
token = strtok(str, " ");
// 이후 호출에서는 NULL을 전달하여 다음 토큰을 검색
while (token != NULL) {
printf("%s\n", token);
token = strtok(NULL, " ");
}
return 0;
}
Hello,
World!
Welcome
to
C
programming.
- strtok 함수는 원본 문자열을 수정하여 구분 문자를 '\0'로 바꾸기 때문에 원본 문자열을 그대로 유지해야 하는 경우 원본 문자열을 복사하여 사용해야 함. 또한, 여러 스레드에서 동시에 호출할 때 문자가 발생할 수 있음.
- strtok_r
- POSIX 표준에서 위의 스레드 문제에 대한 대안으로 재진입(reentrant)이 가능한 strtok_r 함수를 설계.
char *strtok_r(char *str, const char *delim, char **saveptr);
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, World! Welcome to C programming.";
char *token;
char *saveptr;
// 첫 번째 호출에서 분할할 문자열을 전달
token = strtok_r(str, " ", &saveptr);
// 이후 호출에서는 NULL과 상태 포인터를 전달하여 다음 토큰을 검색
while (token != NULL) {
printf("%s\n", token);
token = strtok_r(NULL, " ", &saveptr);
}
return 0;
}
2. strspn
- 첫 번째 문자열에서 두 번째 문자열에 포함된 문자만으로 구성된 가장 긴 접두사의 길이를 반환
size_t strspn(const char *str1, const char *str2);
int main() {
const char *str1 = "12345abc";
const char *str2 = "1234567890";
size_t length = strspn(str1, str2); // 동일한 접두사의 길이 5를 반환
}
3. strcspn
- 첫 번째 문자열에서 두 번째 문자열에 포함되지 않은 문자만으로 구성된 가장 긴 접두사의 길이를 반환
size_t strcspn(const char *str1, const char *str2);
int main() {
const char *str1 = "12345abc";
const char *str2 = "abc";
size_t length = strcspn(str1, str2); // 두 번째 문자열이 포함되지않은 접두사의 길이 5 반환
}
4. strdup
- 문자열을 복사하여 새 메모리를 할당.(동적으로 할당)
- 표준 C 라이브러리에는 포함되지 않지만 일부 컴파일러에서는 제공
- 복사된 문자열은 동적 메모리(malloc)를 사용하여 할당되기 때문에 사용이 끝난 후 반드시 free 함수로 메모리 해제 해야 함. (메모리 누수 발생 방지)
- 메모리 할당 실패 시 NULL 반환
char *strdup(const char *str);
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
const char *original = "Hello, World!";
char *copy = strdup(original);
if (copy == NULL) {
perror("strdup failed");
return 1;
}
printf("Original string: %s\n", original);
printf("Copied string: %s\n", copy);
// 동적 메모리 해제
free(copy);
return 0;
}
- strdup 함수가 지원되지 않는 경우, 직접 구현하는 예제
#include <string.h>
#include <stdlib.h>
char *strdup(const char *str) {
size_t len = strlen(str) + 1; // 널 문자를 포함한 길이
char *copy = malloc(len);
if (copy != NULL) {
memcpy(copy, str, len);
}
return copy;
}
반응형