首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

跪求C语言中字符串函数实现原理,该怎么解决

2013-11-21 
跪求C语言中字符串函数实现原理小弟最近参加一个C语言软件设计师的面试,让自己编写关于字符串操作的一些库

跪求C语言中字符串函数实现原理
    小弟最近参加一个C语言软件设计师的面试,让自己编写关于字符串操作的一些库函数,比如:字符串拷贝strcpy(),内存拷贝memcpy(),字符串连接函数strcat,等等。希望给我大虾给予相关的函数实现,最好是有注释或者算法实现的原理。
   小弟定感激不尽!
[解决办法]
char * __cdecl strcat (
        char * dst,
        const char * src
        )
{
        char * cp = dst;

        while( *cp )
                cp++;                   /* find end of dst */

        while( *cp++ = *src++ ) ;       /* Copy src to end of dst */

        return( dst );                  /* return dst */

}


/***
*char *strcpy(dst, src) - copy one string over another
*
*Purpose:
*       Copies the string src into the spot specified by
*       dest; assumes enough room.
*
*Entry:
*       char * dst - string over which "src" is to be copied
*       const char * src - string to be copied over "dst"
*
*Exit:
*       The address of "dst"
*
*Exceptions:
*******************************************************************************/

char * __cdecl strcpy(char * dst, const char * src)
{
        char * cp = dst;

        while( *cp++ = *src++ )
                ;               /* Copy src over dst */

        return( dst );
}


char * __cdecl strchr (
        const char * string,
        int ch
        )
{
        while (*string && *string != (char)ch)
                string++;

        if (*string == (char)ch)
                return((char *)string);
        return(NULL);
}



int __cdecl strcmp (
        const char * src,
        const char * dst
        )
{
        int ret = 0 ;

        while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
                ++src, ++dst;

        if ( ret < 0 )
                ret = -1 ;
        else if ( ret > 0 )
                ret = 1 ;

        return( ret );
}

size_t __cdecl strnlen(const char *str, size_t maxsize)
{
    size_t n;

    /* Note that we do not check if s == NULL, because we do not
     * return errno_t...
     */

    for (n = 0; n < maxsize && *str; n++, str++)
        ;



    return n;
}



size_t __cdecl strlen (
        const char * str
        )
{
        const char *eos = str;

        while( *eos++ ) ;

        return( eos - str - 1 );
}


errno_t __cdecl strcpy_s(_CHAR *_DEST, size_t _SIZE, const _CHAR *_SRC)
{
    _CHAR *p;
    size_t available;

    /* validation section */
    _VALIDATE_STRING(_DEST, _SIZE);
    _VALIDATE_POINTER_RESET_STRING(_SRC, _DEST, _SIZE);

    p = _DEST;
    available = _SIZE;
    while ((*p++ = *_SRC++) != 0 && --available > 0)
    {
    }

    if (available == 0)
    {
        _RESET_STRING(_DEST, _SIZE);
        _RETURN_BUFFER_TOO_SMALL(_DEST, _SIZE);
    }
    _FILL_STRING(_DEST, _SIZE, _SIZE - available + 1);
    _RETURN_NO_ERROR;
}





#ifdef _DEBUG

#include <crtdbg.h>

char * __cdecl _strdup (
        const char * string
        )
{
        return _strdup_dbg(string, _NORMAL_BLOCK, NULL, 0);
}

char * __cdecl _strdup_dbg (
        const char * string,
        int nBlockUse,
        const char * szFileName,
        int nLine
        )

#else  /* _DEBUG */

char * __cdecl _strdup (
        const char * string
        )

#endif  /* _DEBUG */

{
        char *memory;
    size_t size = 0;

        if (!string)
                return(NULL);

    size = strlen(string) + 1;
#ifdef _DEBUG
        if (memory = _malloc_dbg(size, nBlockUse, szFileName, nLine))
#else  /* _DEBUG */
        if (memory = malloc(size))
#endif  /* _DEBUG */
        {
                _ERRCHECK(strcpy_s(memory, size, string));
        return memory;
        }

        return(NULL);
}


char * __cdecl strncpy (
        char * dest,
        const char * source,
        size_t count
        )
{
        char *start = dest;

        while (count && (*dest++ = *source++))    /* copy string */
                count--;

        if (count)                              /* pad out with zeroes */
                while (--count)
                        *dest++ = '\0';

        return(start);
}



char * __cdecl strstr (
        const char * str1,
        const char * str2
        )
{
        char *cp = (char *) str1;


        char *s1, *s2;

        if ( !*str2 )
            return((char *)str1);

        while (*cp)
        {
                s1 = cp;
                s2 = (char *) str2;

                while ( *s1 && *s2 && !(*s1-*s2) )
                        s1++, s2++;

                if (!*s2)
                        return(cp);

                cp++;
        }

        return(NULL);

}









char * __cdecl _strrev (
        char * string
        )
{
        char *start = string;
        char *left = string;
        char ch;

        while (*string++)                 /* find end of string */
                ;
        string -= 2;

        while (left < string)
        {
                ch = *left;
                *left++ = *string;
                *string-- = ch;
        }

        return(start);
}



char * __cdecl strrchr (
        const char * string,
        int ch
        )
{
        char *start = (char *)string;

        while (*string++)                       /* find end of string */
                ;
                                                /* search towards front */
        while (--string != start && *string != (char)ch)
                ;

        if (*string == (char)ch)                /* char found ? */
                return( (char *)string );

        return(NULL);
}






[解决办法]
char *strcpy(char *dest,char *src)
{
    while(*src)
    {
        *dest = *src;
        *src++;
        *dest++;
    }
    *dest = '\0';
    
    return dest;
}


int strcmp(const char *string1, const char *string2)
{
    while (*string1 
[解决办法]
 *string2)
    {
        
        if(*string1 == *string2)
            return 0;
        if(*string1 < *string2)


            return -1;
        if(*string1 > *string2)
            return 1;
    }
    return 0;
}

char *strcat(char *strDestination, const char *strSource)
{
    while(*strDestination)
    {
        strDestination++;
    }
    while(*strSource)
    {
        *strDestination = *strSource;
        strSource++;
        strDestination++;
    }
    *strDestination = '\0';
    return strDestination;  
}

char *strupr( char *string )
{
    while(*string)
    {
     if (*string<'a' && *string>'z')
    *string-=32;
    string++;
    }
    return string;
}


size_t strlen( const char *string)
{
    int count = 0;
    while(*string)
    {
        count++;
        string++;
    }
    return count;
}


char *strlwr( char *string )
{
    while(*string)
    {
        if (*string<'A' && *string>'Z')
            *string+=32;
        string++;
    }
    return string;
}
[解决办法]



size_t strlen(const char *s)
{
__asm
{
moveax, s
len_align:
testeax, 3
jzlen_loop
testbyte ptr[eax], 0ffh
jzlen_end
inceax
jmplen_align
len_loop:
movedx, [eax]
addeax, 4
mov ecx, edx
sub edx, 01010101h
andedx, 80808080h
jzlen_loop// > 0 and <= 128 continue
notecx
andedx, ecx
jzlen_loop// > 128 continue
bsfecx, edx
shrecx, 3
addeax, ecx
subeax, 4
len_end:
subeax, s
end:
}
}

热点排行