标签:字符串
最近把一些常见的c语言的字符串库函数参照着网上的程序自己实现了一下,也是方便自己复习总结,里面的实现比较经典,下面的函数在我电脑vs2005上都能通过,但未进行严格的测试。点击展开目录,可以直接达到感兴趣的函数实现。
/************************************************************************/ /* 1.strcpy函数实现 2.strncpy实现 3.strcat函数实现 4.strncat函数实现 5.strdup实现 6.strchr实现 7.strrchr函数实现 8.strpbrk函数 9.strstr实现 10.strlen实现 11.strlen另一种实现 12.strcmp函数实现 13.strcmpy的一种标准实现 14.strncpy函数实现 15.memset函数实现*/ /************************************************************************/
//功能说明:将source的字符串复制到dest来
//dest所指向的空间必须有足够的内存来容纳source所指向的字符串
char * my_strcpy(char *dest, const char *source)
{
assert(dest!=NULL && source!=NULL);
char *r = dest;
//*(dest++),先返回*dest, 然后dest++
//(*(dest++) = *(source++)返回最左边表达式的值
while ((*(dest++)=*(source++)) != '\0');
return r;
}
/*
1.注意参数的命名上规范,让人容易明白怎么使用函数
2.第二个参数类型是const char *,防止修改源字符串
3.函数返回值是char *,可以实现链式表达式
4.参数合法性检查,下面的函数同样要遵循这些
*/
//将source的前n个字符串复制到dest
char * my_strncpy(char *dest, const char *source, int n)
{
assert(dest!=NULL && source!=NULL);
char *r = dest;
//注意n--和后面一堆不能换,否则会多复制一个
while (n-- && (*(dest++)=*(source++))!='\0');
return r;
}//将source指向的字符串链接在dest后面
char * my_strcat(char *dest, const char *source)
{
assert(dest!=NULL && source!=NULL);
char *r = dest;
while (*(dest) != '\0')
{
dest++;
}
while ((*(dest++)=*(source++)) != '\0');
return r;
}//将source特定数目字符串链接到dest后面
char * my_strncat(char *dest, const char *source, int n)
{
assert(dest!=NULL && source!=NULL);
char *r = dest;
while (*(dest) != '\0')
{
dest++;
}
while (n-- && (*(dest++)=*(source++))!='\0');
return r;
}//该函数将预先配置内存,然后将制定字符串装入内存
char * my_strdup(const char *pStr)
{
assert(pStr != NULL);
char *r = (char *)malloc(strlen(pStr)+1);
if (NULL == r)
{
printf("Memory Failed!\n");
exit(1);
}
return my_strcpy(r, pStr);
}//函数功能在字符串中查找指定的第一个字符,并返回指向该字符的指针
//若未找到,则返回指向'\0'的字符串指针
char * my_strchr(const char *pStr, char ch)
{
assert(pStr != NULL);
while (*pStr!='\0' && *pStr!=ch)
{
pStr++;
}
return (char *)pStr;
}//函数功能:查找一个字符c在另一个字符串str中末次出现的位置(也就是从str的右侧开始查找字符c首次出现的位置)
char * my_strrchr(const char *pStr, char ch)
{
assert(pStr != NULL);
const char *r = NULL;
while (*pStr != '\0')
{
if (*pStr == ch)
{
r = pStr;
}
pStr++;
}
return (char *)r;
}//函数功能:在两个字符串中寻找首次共同出现的字符,返回该字符在str1中的地址
char *my_strpbrk(const char *str1, const char *str2)
{
assert(str1!=NULL && str2!=NULL);
const char *tmp = str2;
while (*str1 != '\0' )
{
tmp = str2;
while (*tmp != '\0')
{
if (*str1 == *tmp)
{
return (char *)str1;
}
tmp++;
}
str1++;
}
return NULL;
}//若字符串2包含在字符串1里面,返回它在字符串1中的位置,否则返回NULL
char * my_strstr(const char *strDes, const char *str)
{
assert(strDes!=NULL && str!=NULL);
const char *tmpDes = NULL;
const char *tmpStr = NULL;
while (*strDes != '\0')
{
for (tmpDes=strDes, tmpStr=str;
*tmpDes==*tmpStr && *tmpStr!='\0';
tmpDes++, tmpStr++)
{}
if ('\0' == *tmpStr)
{
return (char *)strDes;
}
strDes++;
}
return NULL;
}//该函数返回字符串长度,不包括后面的'\0'
int my_strlen(const char *str)
{
assert(str != NULL);
int k = 0;
while (++k && *(str++)!='\0');
return k-1;
}int my_strlen(const char *str)
{
assert(str != NULL);
const char *eos = str; //eos means end of string
while (*(eos++) != '\0');
return (int)(eos - str - 1);
}//两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止
//s1>s2,返回值大于0,s1<s2返回值小于0,否则等于0
int my_strcmp(const char *str1, const char *str2)
{
assert(str1!=NULL && str2!=NULL);
while (*str1!='\0' && *str2!='\0' && *str1==*str2)
{
str1++;
str2++;
}
return (*str1 - *str2);
}int my_strcmp(const char *str1, const char *str2)
{
assert(str1!=NULL && str2!=NULL);
int ret = 0;
while (!(ret=*(unsigned char *)str1-*(unsigned char *)str2) && *str2!='\0')
{
printf("%c - %c = %d\n", *str1, *str2, *str1-*str2);
str1++;
str2++;
}
if (ret > 0)
{
return 1;
}
else if (ret < 0)
{
return -1;
}
else
{
return 0;
}
}//函数比较两个字符串中前n个字符串大小
int my_strncmp(const char *str1, const char *str2, int n)
{
assert(str1!=NULL && str2!=NULL);
if (n <= 0)
{
return 0;
}
while (--n && *str1!='\0' && *str1==*str2)
{
str1++;
str2++;
}
return (*str1 - *str2);
}//将指定内存区域的前count个字节设定为指定值
void *my_memeset(void *buffer, int c, unsigned int count)
{
if (count <= 0)
{
return buffer;
}
assert(buffer != NULL);
char *p = (char *)buffer;
while (count--)
{
*(p++) = (char)c;
}
return buffer;
}标签:字符串
原文地址:http://blog.csdn.net/a635661820/article/details/44877027