跪求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:
}
}