검색결과 리스트
strpbrk에 해당되는 글 1건
- 2011.04.29 문자열 조작함수 직접 구현하기 (2)
글
문자열 조작함수 직접 구현하기
언어로그/C/C++
2011. 4. 29. 14:41
API를 이해하기 위한 가장 좋은 방법 중 하나는 직접 구현해보는 것이다
string.h 에서 지원하는 문자열 조작 함수들을 직접 구현해보았다. 이 함수들은 이름에 'str' 이라는 접두어를
string.h 에서 지원하는 문자열 조작 함수들을 직접 구현해보았다. 이 함수들은 이름에 'str' 이라는 접두어를
가지고 있는데 직접 구현한 버전에는 "my_" 라는 접두어를 붙혔다.
1. 문자열 함수들의 프로토 선언과 기능
- // 문자열 s의 길이를 반환하는 함수
int strlen(char *s);
// s에 문자열 t를 복사하는 함수- void strcpy(char *s, char *t);
- // 두 문자열을 비교하는 함수 : 같으면 0, 앞문자열이 크면 양수, 작으면 음수반환
- int strcmp(char *s, char *t);
// 문자열 dest의 끝에 src 문자열을 연결하는 함수
- char *strcat(char *dest, const char *src)
- // 문자열 string에서 문자 c를 찾아 위치를 반환하는 함수. 없으면 NULL 반환
- char *strchr(const char *string, int c);
- // 문자열 string의 끝에서부터 문자 c를 찾아 위치를 반환하는 함수. 없으면 NULL 반환
- char *strrchr(const char *string, int c);
- // 문자열 string에서 문자열 strSearch를 찾아 첫번째 위치를 반환. 없으면 NULL 반환
- char *strstr(const char *string, const char *strSearch);
- // 문자열 string에서 strCharSet문자열에 속한 문자가 발견되면 그 위치를 반환. 없으면 NULL 반환
- char *strpbrk(const char *string, const char *strCharSet);
- // 문자열 str에서 delims 문자열에 속한 문자를 구분자로 분리해주는 함수. 첫번째 호출후
- // NULL 을 주어 호출하면, 기존 문자열에서 계속 구분자를 기준으로 분리해서 반환해줌// 원 문자열을 변경하기 때문에 원치않다면 원문자열의 복사본을 사용해야 한다.
- char *strtok(char *str, const char *delims);
2. 문자열 조작 함수의 구현
#include <stdio.h>
#include <string.h>
int my_strlen(char *s);
void my_strcpy(char *s, char *t);
int my_strcmp(char *s, char *t);
char *my_strcat(char *dest, const char *src);
char *my_strncat(char *dest, const char *src,size_t count);
char *my_strchr(const char *string, int c);
char *my_strrchr(const char *string, int c);
char *my_strstr(const char *string, const char *strSearch);
char *my_strpbrk(const char *string, const char *strCharSet);
char *my_strtok(char *str, const char *delims);
int main (int argc, char const* argv[])
{
char dest[1024] = "nice to meet you!";
char *test = "my name is kimsungbae! what's up?";
char *token;
printf("strchr : %s \n", strchr(test, '!'));
printf("my_strchr: %s \n", my_strchr(test, '!'));
printf("\n");
printf("strrchr : %s \n", strrchr(test, '\''));
printf("my_strrchr: %s \n", my_strchr(test, '\''));
printf("\n");
printf("strstr : %s \n", strstr(test, "is"));
printf("my_strstr: %s \n", my_strstr(test, "is"));
printf("\n");
printf("my_strcat : %s \n", my_strcat(dest, test));
printf("my_strncat: %s \n", my_strncat(dest, "@@@@@@@@", 2));
printf("\n");
printf("strpbrk : %s \n", strpbrk(test, "?!\'"));
printf("my_strpbrk : %s \n", my_strpbrk(test, "?!\'"));
token = my_strtok(dest, " ");
printf("%s \n", token);
while ((token = my_strtok(NULL, " ")) != NULL) {
printf("%s \n", token);
}
return 0;
}
int my_strlen(char *s) {
char *p = s;
while (*p++ != '\0');
return p - s;
}
void my_strcpy(char *s, char *t) {
while (*s++ = *t++) ;
}
int my_strcmp(char *s, char *t) {
for (; *s == *t; s++, t++) {
if (*s == '\0') {
return 0;
}
}
return *s - *t;
}
char *my_strcat(char *dest, const char *src) {
char *p_dest = dest;
while (*p_dest != '\0') {
p_dest++;
}
while (*src != '\0') {
*p_dest++ = *src++;
}
*p_dest = '\0';
return dest;
}
char *my_strncat(char *dest, const char *src,size_t count) {
char *p_dest = dest;
while (*p_dest != '\0') {
p_dest++;
}
while (*src != '\0' && count > 0) {
*p_dest++ = *src++;
count--;
}
*p_dest = '\0';
return dest;
}
char *my_strchr(const char *str, int c) {
while (*str != '\0') {
if (*str == c) {
return str;
}
str++;
}
return NULL;
}
char *my_strrchr(const char *str, int c) {
char *p_str = str + strlen(str) - 1;
while (p_str > str) {
if (*p_str == c) {
return p_str;
}
p_str--;
}
return NULL;
}
char *my_strstr(const char *str, const char *search) {
char *start = NULL;
while (*str != '\0') {
if (start != NULL && *search == '\0') {
break;
}
if (start != NULL && *str != *search) {
start = NULL;
}
if (start == NULL && *str == *search) {
start = str;
}
if (start != NULL && *str == *search) {
search++;
}
str++;
}
return (start != NULL) ? start : NULL;
}
char *my_strpbrk(const char *str, const char *charset) {
char *p_char;
while (*str != '\0') {
p_char = charset;
while (*p_char != '\0') {
if (*str == *p_char++) {
return str;
}
}
str++;
}
return NULL;
}
char *my_strtok(char *str, const char *delims) {
static char *tmp, *pstart;
char *p_delims;
if (str != NULL) {
tmp = str;
}
if (*tmp == '\0') {
return NULL;
}
pstart = tmp;
while (*tmp != '\0') {
p_delims = delims;
while (*p_delims != '\0') {
if (*tmp == *p_delims++) {
*tmp++ = '\0';
return pstart;
}
}
tmp++;
}
return pstart;
}
#include <string.h>
int my_strlen(char *s);
void my_strcpy(char *s, char *t);
int my_strcmp(char *s, char *t);
char *my_strcat(char *dest, const char *src);
char *my_strncat(char *dest, const char *src,size_t count);
char *my_strchr(const char *string, int c);
char *my_strrchr(const char *string, int c);
char *my_strstr(const char *string, const char *strSearch);
char *my_strpbrk(const char *string, const char *strCharSet);
char *my_strtok(char *str, const char *delims);
int main (int argc, char const* argv[])
{
char dest[1024] = "nice to meet you!";
char *test = "my name is kimsungbae! what's up?";
char *token;
printf("strchr : %s \n", strchr(test, '!'));
printf("my_strchr: %s \n", my_strchr(test, '!'));
printf("\n");
printf("strrchr : %s \n", strrchr(test, '\''));
printf("my_strrchr: %s \n", my_strchr(test, '\''));
printf("\n");
printf("strstr : %s \n", strstr(test, "is"));
printf("my_strstr: %s \n", my_strstr(test, "is"));
printf("\n");
printf("my_strcat : %s \n", my_strcat(dest, test));
printf("my_strncat: %s \n", my_strncat(dest, "@@@@@@@@", 2));
printf("\n");
printf("strpbrk : %s \n", strpbrk(test, "?!\'"));
printf("my_strpbrk : %s \n", my_strpbrk(test, "?!\'"));
token = my_strtok(dest, " ");
printf("%s \n", token);
while ((token = my_strtok(NULL, " ")) != NULL) {
printf("%s \n", token);
}
return 0;
}
int my_strlen(char *s) {
char *p = s;
while (*p++ != '\0');
return p - s;
}
void my_strcpy(char *s, char *t) {
while (*s++ = *t++) ;
}
int my_strcmp(char *s, char *t) {
for (; *s == *t; s++, t++) {
if (*s == '\0') {
return 0;
}
}
return *s - *t;
}
char *my_strcat(char *dest, const char *src) {
char *p_dest = dest;
while (*p_dest != '\0') {
p_dest++;
}
while (*src != '\0') {
*p_dest++ = *src++;
}
*p_dest = '\0';
return dest;
}
char *my_strncat(char *dest, const char *src,size_t count) {
char *p_dest = dest;
while (*p_dest != '\0') {
p_dest++;
}
while (*src != '\0' && count > 0) {
*p_dest++ = *src++;
count--;
}
*p_dest = '\0';
return dest;
}
char *my_strchr(const char *str, int c) {
while (*str != '\0') {
if (*str == c) {
return str;
}
str++;
}
return NULL;
}
char *my_strrchr(const char *str, int c) {
char *p_str = str + strlen(str) - 1;
while (p_str > str) {
if (*p_str == c) {
return p_str;
}
p_str--;
}
return NULL;
}
char *my_strstr(const char *str, const char *search) {
char *start = NULL;
while (*str != '\0') {
if (start != NULL && *search == '\0') {
break;
}
if (start != NULL && *str != *search) {
start = NULL;
}
if (start == NULL && *str == *search) {
start = str;
}
if (start != NULL && *str == *search) {
search++;
}
str++;
}
return (start != NULL) ? start : NULL;
}
char *my_strpbrk(const char *str, const char *charset) {
char *p_char;
while (*str != '\0') {
p_char = charset;
while (*p_char != '\0') {
if (*str == *p_char++) {
return str;
}
}
str++;
}
return NULL;
}
char *my_strtok(char *str, const char *delims) {
static char *tmp, *pstart;
char *p_delims;
if (str != NULL) {
tmp = str;
}
if (*tmp == '\0') {
return NULL;
}
pstart = tmp;
while (*tmp != '\0') {
p_delims = delims;
while (*p_delims != '\0') {
if (*tmp == *p_delims++) {
*tmp++ = '\0';
return pstart;
}
}
tmp++;
}
return pstart;
}
'언어로그 > C/C++' 카테고리의 다른 글
| 과제 #1 입출력,연산자 (0) | 2011.06.13 |
|---|---|
| 음수의 표현 (0) | 2011.06.13 |
| 문자열 조작함수 직접 구현하기 (2) | 2011.04.29 |
| 라인 입출력 함수 (0) | 2011.03.27 |
| 배열의 이해 (0) | 2011.03.27 |
| 기억부류(Storage Class) / 변수 (0) | 2011.03.27 |
c함수,
strcat,
strchr,
strcmp,
strcpy,
string,
strlen,
strpbrk,
strrchr,
strstr,
strtok,
문자열,
문자열 조작,
함수
my_string.c