您的位置:首页 > 编程语言 > C语言/C++

c语言字符串操作实现

2013-03-17 12:04 295 查看
复试前,用字符串相关的操作来练练手。敲一遍总该用些用处。

#include <stdio.h>
#include <assert.h>
#include <malloc.h>

int strlen(const char *str)
{
assert(str!=NULL);
int len = 0;
while(*str++)
++len;
return len;
}

char *strcpy(char *to, const char *from)
{
assert((to!=NULL)&&(from!=NULL));
char *result = to;
while(*to++ = *from++);
return result;
}

char *strncpy(char *to, const char *from, size_t count)
{
assert((to!=NULL)&&(from!=NULL));
char *result = to;
while (count--)
{
if (*from)
*to++=*from++;
else
{
*to++='\0';
break;
}
}
return result;
}

void *memset(void *buffer, int c, size_t count)
{
assert(buffer!=NULL);
char *p = (char *)buffer;
while(count--)
*p++ = (char)c;
return buffer;
}

char *strchr(char *str, int c)
{
assert(str!=NULL);
for (;*str!=(char)c;++str)
{
if(!(*str))
return NULL;
}
return str;
}

//need to release the block by hand in your outside code
char *strcat(char *strDes, const char *strSrc)
{
assert((strDes!=NULL)&&(strSrc!=NULL));
char *address = strDes;
int len = 0;
while(*strDes)
{
len++;
strDes++;
}
char *strResult = (char *)malloc(len+1+strlen(strSrc));
char *strRtmp = strResult;
while(*strResult++=*address++);
strResult--;
while(*strResult++=*strSrc++);
return strRtmp;
}

char * strncat(char *strDes, const char *strSrc, unsigned int count)
{
assert((strDes!=NULL)&&(strSrc!=NULL));
char *address = strDes;
while(*strDes)
++strDes;
while(count--&&*strSrc)
*strDes++=*strSrc++;
*strDes = '\0';
return address;
}

char *strstr(const char *strSrc, const char *str)
{
assert(strSrc!=NULL&&str!=NULL);
const char *s = strSrc;
const char *t = str;
for (;*strSrc;++strSrc)
{
for(s=strSrc,t=str;*t&&*s==*t;++s,++t);
if(!(*t))
return (char *)strSrc;
}
return NULL;
}

//need to release the block by hand in your outside code
char *strdup(char *strSrc)
{
if (strSrc!=NULL)
{
char *start = strSrc;
int len = 0;
while(*strSrc++)
len++;
char *address =(char *)malloc(len+1);
assert(address!=NULL);
while((*address++=*start++));
return address-(len+1);
}
return NULL;
}

void *memcpy(void *to, const void *from, size_t count)
{
assert((to!=NULL)&&(from!=NULL));
void *result = to;
char *pto = (char *)to;
char *pfrom = (char *)from;
while(count--)
*pto++=*pfrom++;
return result;
}

void *memmove(void *to, const void *from, size_t count)
{
assert((to!=NULL)&&(from!=NULL));
void *result = to;
char *pto = (char *)to;
char *pfrom = (char *)from;
assert(pto<pfrom||pto>pfrom+count-1);
if(pto<pfrom||pto>pfrom+count-1)
while(count--)
*pto++ = *pfrom++;
else
{
pto = pto+count-1;
pfrom = pfrom+count-1;
while(count--)
*pto-- = *pfrom--;
}
return result;
}

int strcmp(const char *s, const char *t)
{
assert(s!=NULL&&t!=NULL);
while(*s&&*t&&*s==*t)
{
++s;++t;
}
return (*s-*t);
}

int stricmp(const char *dst, const char *src)
{
assert(dst!=NULL&&src!=NULL);
int ch1, ch2;
while (*dst&&*src)
{
if((ch1=(int)*dst)>='A'&&(ch1<='Z'))
ch1+=0x20;
if((ch2=(int)*src)>='A'&&(ch2<='Z'))
ch2+=0x20;
if(ch1==ch2)
{
++dst;++src;
}
else break;
}
return (ch1-ch2);
}

int strncmp(const char *s, const char *t, unsigned int count)
{
assert((s!=NULL)&&(t!=NULL));
while (*s&&*t&&*s==*t&&count--)
{
++s;++t;
}
return (*s-*t);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: