1. my_strcpy( strcpy )
2. my_strlen( strlen )
3. my_strcat( strcat )
4. reverse( reverse )
5. swap( swap )
6. my_strcmp( strcmp )
7. my_strchr( strchr )
8. my_strstr( strstr )
9. my_strspn( strspn ) - 지정한 토큰이 아닌 곳의 인덱스를 반환한다.
10. my_strtok( strtok )
#include <stdio.h>
#include <assert.h>
void my_strcpy( char * dest, char * src )
{
assert(src!=0 && dest!=0);
while( (*dest++ = *src++) != 0 )
// nothing ;
}
#include <assert.h>
void my_strcpy( char * dest, char * src )
{
assert(src!=0 && dest!=0);
while( (*dest++ = *src++) != 0 )
// nothing ;
}
2. my_strlen( strlen )
// 자료형끼리의 길이를 빼주는 방식으로 구한다.
// 포인터를 이용하는 방식을 선호해보자.
int my_strlen( char* arg )
{
char *base = arg;
for( ; *arg != '\0'; ++arg)
NULL/*nothing*/;
return (int)(arg - base); // 포인터와 포인터를 빼면 그 길이가 나온다.
}
// 포인터를 이용하는 방식을 선호해보자.
int my_strlen( char* arg )
{
char *base = arg;
for( ; *arg != '\0'; ++arg)
NULL/*nothing*/;
return (int)(arg - base); // 포인터와 포인터를 빼면 그 길이가 나온다.
}
3. my_strcat( strcat )
// dest의 오버플로우는 보장해주지 않는다. 사용자가 해야 하는 일.
void my_strcat( char* dest, char* src )
{
while( *dest != '\0' )
++dest; // NULL 위치를 가리키는 포인터로 만든다.
while( (*dest++ = *src++) != '\0' )
/*nothing*/;
}
void my_strcat( char* dest, char* src )
{
while( *dest != '\0' )
++dest; // NULL 위치를 가리키는 포인터로 만든다.
while( (*dest++ = *src++) != '\0' )
/*nothing*/;
}
4. reverse( reverse )
// 손바닥을 뒤집듯이 처음과 끝부터 차례대로 바꾼다.
// 가운데, 즉 역전 되기 전까지 바꿔나간다. => | <=
// 한글이 섞여 있다면 안된다. 2바이트랑 1바이트랑 바꾸기가 힘들다.
void reverse( char* arg )
{
int len = strlen( arg );
int i, j, t;
for( i = 0, j = len - 1; i < j; ++i, --j )
{
t = arg[i];
arg[i] = arg[j];
arg[j] = t;
}
}
// 가운데, 즉 역전 되기 전까지 바꿔나간다. => | <=
// 한글이 섞여 있다면 안된다. 2바이트랑 1바이트랑 바꾸기가 힘들다.
void reverse( char* arg )
{
int len = strlen( arg );
int i, j, t;
for( i = 0, j = len - 1; i < j; ++i, --j )
{
t = arg[i];
arg[i] = arg[j];
arg[j] = t;
}
}
5. swap( swap )
void swap( void* dest, void* src, int size )
{
void *temp = malloc( size );
memcpy( temp, dest, size );
memcpy( dest, src, size );
memcpy( src, temp, size );
free( temp );
}
{
void *temp = malloc( size );
memcpy( temp, dest, size );
memcpy( dest, src, size );
memcpy( src, temp, size );
free( temp );
}
6. my_strcmp( strcmp )
int my_strcmp( char* dest, char* src )
{
int ret;
// 같았는데 '\0' 이 아니라면 또 비교하고 .. 비교하고.
// 같지 않다면 음수나 양수를 리턴시켜준다.
// while( ( ret = *dest++ - *src ) == 0 && *src++ != '\0' )
while( 1 )
{
if( ( ret = *dest++ - *src ) != 0 || *src++ == '\0' )
break;
}
return ret;
}
{
int ret;
// 같았는데 '\0' 이 아니라면 또 비교하고 .. 비교하고.
// 같지 않다면 음수나 양수를 리턴시켜준다.
// while( ( ret = *dest++ - *src ) == 0 && *src++ != '\0' )
while( 1 )
{
if( ( ret = *dest++ - *src ) != 0 || *src++ == '\0' )
break;
}
return ret;
}
7. my_strchr( strchr )
char* my_strchr( char *dest, int src )
{
for( ; *dest != src; ++dest )
if( *dest == 0 )
return 0;
return dest;
}
{
for( ; *dest != src; ++dest )
if( *dest == 0 )
return 0;
return dest;
}
8. my_strstr( strstr )
char* my_strstr( char* dest, char* src ) {
int i, j;
int len_dest = strlen(dest);
int len_src = strlen(src);
for( i = 0; i < len_dest - len_src+1; ++i )
{
for( j = 0; j < len_src; ++j )
{
if( dest[i+j] != src[j] )
break;
}
if( j == len_src ) // 끝까지 루프를 돌아으므로 같다는 의미..
{
return dest+i;
}
}
return 0;
}
int i, j;
int len_dest = strlen(dest);
int len_src = strlen(src);
for( i = 0; i < len_dest - len_src+1; ++i )
{
for( j = 0; j < len_src; ++j )
{
if( dest[i+j] != src[j] )
break;
}
if( j == len_src ) // 끝까지 루프를 돌아으므로 같다는 의미..
{
return dest+i;
}
}
return 0;
}
9. my_strspn( strspn ) - 지정한 토큰이 아닌 곳의 인덱스를 반환한다.
int my_strspn( char* dest, char* src )
{
int i, j;
int len_dest = strlen( dest );
int len_src = strlen( src );
for( i = 0; i < len_dest; ++i )
{
for( j = 0; j < len_src; ++j )
{
if( dest[i] == src[j] )
break;
}
if( j == len_src )
return i;
}
return i; // 끝까지 갔다면 NULL의 인덱스가 리턴된다.
}
{
int i, j;
int len_dest = strlen( dest );
int len_src = strlen( src );
for( i = 0; i < len_dest; ++i )
{
for( j = 0; j < len_src; ++j )
{
if( dest[i] == src[j] )
break;
}
if( j == len_src )
return i;
}
return i; // 끝까지 갔다면 NULL의 인덱스가 리턴된다.
}
10. my_strtok( strtok )
char * my_strtok(char * str, char * del)
{
static char *curr;
char *sbegin, *send;
sbegin = str ? str : curr;
if (!sbegin)
return 0;
sbegin += strspn(sbegin,del);
if (*sbegin == 0)
{
curr = 0;
return 0;
}
send = strpbrk( sbegin, del);
if (send && *send )
*send++ = 0;
curr = send;
return sbegin;
}
{
static char *curr;
char *sbegin, *send;
sbegin = str ? str : curr;
if (!sbegin)
return 0;
sbegin += strspn(sbegin,del);
if (*sbegin == 0)
{
curr = 0;
return 0;
}
send = strpbrk( sbegin, del);
if (send && *send )
*send++ = 0;
curr = send;
return sbegin;
}
Tag | 문자열함수