1、函数介绍
1.1 strlen 计算字符串长度
1、字符串已经 '\0' 作为结束标志, strlen 函数返回的是在字符串中 '\0' 前面出现的字符个数(不包 含 '\0' ) 。2、参数指向的字符串必须要以 '\0' 结束。3、注意函数的返回值为 size_t ,是无符号的( 易错 )。
对于第3点易错点有以下代码分析
#include <stdio.h>
int main()
{
const char* str1 = "abcdef";
const char* str2 = "abc";
if (strlen(str2) - strlen(str1) > 0)
{
printf("str2 > str1\n");
}
else
{
printf("str2 < str1\n");
}
return 0;
}
以上代码运行结果如下图所示
对此,我们感到很奇怪,为什么输出结果 str2 > str1 呢?
是由于strlen函数的返回值是size_t类型的,即无符号整型,所以两个无符号整型的数据相减,同样是无符号整形,该类型的数据恒大于0,所以会输出以上结果。
模拟实现strlen函数
//1.计数器法
int my_strlen(const char* str)
{
assert(str);
int count = 0;
while (*str != '\0')
{
str++;
count++;
}
return count;
}
//2.递归实现strlen
int my_strlen(const char* str)
{
assert(str);
if (*str == '\0')
return 0;
else
return 1 + my_strlen(str + 1);
}
//利用指针-指针实现strlen
int my_strlen(const char* str)
{
assert(str);
char* p = str;
while (*str != '\0')
{
str++;
}
return str - p;
}
1.2 strcpy 拷贝字符串
1、源字符串必须以 '\0' 结束。2、会将源字符串中的 '\0' 拷贝到目标空间。3、目标空间必须足够大,以确保能存放源字符串。4、目标空间必须可变。
模拟实现strcpy函数
char* my_strcpy(char* dest, char* src)
{
assert(dest && src);
char* ret = dest;
while (*dest++ = *src++)
{
;
}
return dest;
}
1.3 strcmp 比较字符串
//模拟实现strcmp
int my_strcmp(const char* str1,const char* str2)
{
assert(str1 && str2);
while (*str1!='\0' && * str1 == *str2)
{
str1++;
str2++;
}
if (str1 == '\0')
return 0;
return *str1 - *str2;
}
1.4 strcat 追加字符串
1、源字符串必须以 '\0' 结束。2、目标空间必须有足够的大,能容纳下源字符串的内容。3、目标空间必须可修改。4、注意,不能字符串自己给自己追加。
//模拟strcat
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;
while (*dest != '\0')
{
dest++;
}
while (*dest++ = *src++)
{
;
}
return ret;
}
以上个数不受限的字符串函数,还有几个个数受限的字符串函数,例如strncpy,strncmp,strncat。
1.5 strstr 查找字符串
该函数返回值是找到的字符串的起始地址。
//举例说明strstr的用法
int main()
{
char str1[] = "abbbcdef";
char str2[] = "bbc";
char* find_str = strstr(str1, str2);
printf("%s\n", find_str);
return 0;
}
//模拟实现strstr
char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2);
const char* s1 = str1;
const char* s2 = str2;
const char* p = s1;
while (*p)
{
s2 = str2;
s1 = p;
while (*s2 != '\0' && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return (char*)p;
}
p++;
}
return NULL;
}