문자열 함수의 구현

from Study/C언어 2007/11/29 16:22 view 29478
1. my_strcpy( strcpy )
#include <stdio.h>
#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);    // 포인터와 포인터를 빼면 그 길이가 나온다.
}

3. my_strcat( strcat )
// dest의 오버플로우는 보장해주지 않는다. 사용자가 해야 하는 일.
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;
    }
}

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 );
}

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;
}

7. my_strchr( strchr )
char* my_strchr( char *dest, int src )
{
    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;
}

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의 인덱스가 리턴된다.
}

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;
}

아~ Hello World

from 잡담 2007/11/29 16:07 view 28193

 아~ 작년 8월초인가 부터 시작한 프로그래밍의 "Hello World"...

뭐든지 구글로 검색 해보는 습관이 들어서 hello world 를 치니 모든 언어의 hello world를 보여주고 있다.

사이트 : http://roesler-ac.de/wolfram/hello.htm 

The first Hello World program appeared in chapter 1.1 of the first edition of Kernighan & Ritchie's original book about C, "The C Programming Language", in 1978 and read like this:

main()
{
    printf("hello, world\n");
}

저 구문을 1학년 때 쳐 보고 작년에 다시 시작하면서 쳐 본거 같다. 콘솔창에 글씨가 나오는 게 그저 신기했다.
 
아직도 무언가 만들고 릴리즈 한다는 것이 좋다. 하지만 뒤늦게 시작했다는 불안감은 떨칠 수 없다.

공부를 하다보면 그 분야에서 읽어야 할 것, 배워야 할 것, 익혀야 할 것이 거미줄 처럼 얽히고 섥혀 있다.

요새 그 맥락을 잡지 못하는 기분이다. 알면 알수록 더 알아야 할것이 많다고 할까...

아 시작점에서 1미터 정도 달린 기분이다.

"한순간의 호기심으로 이쪽으로 들어오지 말라."
"지금이라도 다른길을 알아보는 것도 좋은 생각이다."
"기본이 없는 개발자는 타이핑만 하는 거다."
......

블로그를 돌아다니다 보면 질책성 글들이 많다. 더 우울해진다..