对c语言的字符串处理的常用库函数总结一下,并进行实现。
1. 字符串比较
1. 字符串比较:
int strcmp(consyt char *s1,const char *s2);
比较两个字符串的大小(不忽略大小写),是以ASCII码表上顺序来比较的,strcmp()首先将s1第一个字符值减去s2,第一个字符值,若差值为0,则再比较下一个字符,若差值不为0,则将差值返回。
实现如下:
/*
字符串比较:
int strcmp(consyt char *s1,const char *s2);
比较两个字符串的大小(不忽略大小写),是以ASCII码表上顺序来比较的,strcmp()首先将s1第一个字符值减去s2,第一个字符值,若差值为0,则再比较下一个字符,若差值不为0,则将差值返回。
*/
int my_strcmp(const char *s1,const char *s2)
{
if (NULL == s1 && NULL == s2)
{
printf("my_strcmp() err\n");
}
while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)
{
s1++;
s2++;
}
return *s1 - *s2;
}
注:while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)
*s1 != '\0'等价于 *s1
测试:
char *str1 = "abcd";
char *str2 = "abae";
printf("my_strcmp(str1,str2):%d \n",my_strcmp(str1,str2));
1. 字符串N比较
strcmp是常用的字符串比较函数,一般用法是if(!strcmp(s1,s2)){}.如果不是对z整个字符串进行比较而只是比较指定数目的字符串,可以使用函数:
int strncmp(const char* s1,const *s2,size_t n);
比较给定字符串的前N个字符,或者遇到任一字符串结尾
实现如下
int my_strncmp(const char *s1,const char *s2,size_t n)
{
if (NULL == s1 || NULL == s2 || n < 0)
{
printf("my_strncmp() err\n");
}
int num = 1;
while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2 && num < n)
{
s1++;
s2++;
num++;
}
return *s1 - *s2;
}
测试:
printf("my_strncmp(str1,str2):%d \n",my_strncmp(str1,str2,4));
2. 字符串查找:
cahr * strchr(const char *s,int c)
函数返回在s中找到第一个c的位置指针,注意的是,字符串末尾的’\0’也是可以被查找到的。
实现1:
char * my_strchr(char *s,int c)
{
if (NULL == s)
{
printf("my_strchr() err\n");
}
while (*s != '\0' && *s != c)
{
++s;
}
return *s == c ? s:NULL;
}
或者直接把int c换成char c
char * my_strchr2(char *s,char c)
{
if (NULL == s)
{
printf("my_strchr() err\n");
}
while (*s != '\0' && *s != c)
{
++s;
}
return *s == c ? s:NULL;
}
测试:
printf("strchr:%s\n",my_strchr2(str1,'b'));
3. strstr:查找字符串函数
char *strstr(const char s1,const char *s2)
函数返回s2在s1中出现的首字符的位置
const char *my_strstr(const char *s1,const char *s2)
{
if (NULL == s1 && NULL == s2)
{
printf("my_strstr() err\n");
}
while(*s1 != '\0')
{
const char *p = s1;
const char *q = s2;
const char *res = NULL;
if(*p == *q)
{
res = p;
while(*p && *q && *p++ == *q++)
;
if(*q == '\0')
return res;
}
s1++;
}
return NULL;
}
测试:
printf("my_strstr(str1,str2):%s \n",my_strstr(str1,str2));
4. 字符串复制
strcpy: char *strcpy(char *dst,const char *src);
把src所指向的由NULL结尾的字符串复制到由dst所指向的字符串中
char *my_strcpy(char *dst,const char *src)
{
char *s = dst;
while (*dst++ = *src++)
;
return s;
}