声明:由于本人水平有限,文章中难免有不准确和错误之处本人也很想知道这些错误,恳请读者批评指正,大家一起努力,加油!
目录
本章本章主要介绍字符和字符串相关库函数,与模拟实现。
1.strlen
作用介绍:求字符串长度(不包含‘\0’)
函数的使用:
int main()
{
char arr[] = "abcd";
int len = strlen(arr);
printf("%d\n", len);//结果为4
return 0;
}
模拟实现
方式一:计数器的方法
int my_strlen(char* str)
{
int count = 0;//计数器
while (*str)
{
count++;
str++;
}
return count;
}
int main()
{
char arr[] = "abcd";
int len =my_strlen(arr);
printf("%d\n", len);//结果为4
return 0;
}
方式二:指针—指针的方法
int my_strlen(char* str)
{
char* strart = str; //记住str的初始位置
while (*str)
{
str++;
}
return str - strart; //指针-指针返回中间元素的个数
}
int main()
{
char arr[] = "abcd";
int len =my_strlen(arr);
printf("%d\n", len);//结果为4
return 0;
}
方式三:递归的方法
int my_strlen(char* str)
{
if (*str)
return 1 + my_strlen(str + 1);
else
return 0;
}
int main()
{
char arr[] = "abcd";
int len =my_strlen(arr);
printf("%d\n", len);//结果为4
return 0;
}
前面计数器和指针减去指针的方式很容易理解,我们好好分析一下递归的实现,思想就是判断是否为‘\0‘,如果不是那就1+字符串+1,如下图所示:
2.strcpy
作用介绍:字符串拷贝(包括’ \0’)
函数的使用:
int main()
{
char arr1[10] = "*********";
char arr2[] = "abcd";
strcpy(arr1, arr2);//将字符串2中的内容拷贝到字符串1中
printf("%s\n", arr1);
return 0;
}
模拟实现
void my_strcpy(char* s1, char* s2)
{
while (*s2)
{
*s1 = *s2;
s1++;
s2++;
}
*s1 = '\0'; //对\0的拷贝,字符串结束的标志必不可少
}
int main()
{
char arr1[10] = "*********";
char arr2[] = "abcd";
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
3.strcat
作用:将source所指向的字符串追加到destination后
函数的使用
int main()
{
char arr1[10] = "abcd";
char arr2[] = "efgh";
strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
模拟实现
void my_strcat(char* str1, char* str2)
{
while (*str1)//找到目标字符串的\0
{
str1++;
}
while (*str2++=*str2++)//追加源字符串
{
;
}
}
int main()
{
char arr1[10] = "abcd";
char arr2[] = "efgh";
my_strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
注意:strcat不能自己拷贝自己!这样会把'\0'覆盖,永远不会停下来了。
4.strcmp
作用介绍:比较两个字符串大小,相等则返回0
>0 | 第一个字符串大于第二个字符串 |
=0 | 第一个字符串等于第二个字符串 |
<0 | 第一个字符串小于第二个字串串 |
比较str1和str2对应字符的ascii码值!
函数的使用
int main()
{
char arr1[] = "abcde";
char arr2[] = "abcde";
if (strcmp(arr1, arr2) == 0)
{
printf("相等");
}
return 0;
}
模拟实现
int my_strcmp(char* s1, char* s2)
{
while (*s1 == *s2)//判断s1和s2是否相等
{
if (*s1 == '\0' )
return 0;
s1++;
s2++;
}
return *s1-*s2;
}
int main()
{
char arr1[] = "abc";
char arr2[] = "abc";
int ret = my_strcmp(arr1, arr2);
if (ret > 0)
{
printf(">");
}
else if (ret < 0)
{
printf("<");
}
else
{
printf("=");
}
return 0;
}
5.strncpy
作用介绍:将source中的num个字符拷贝到 destination中
函数的使用
int main()
{
char arr1[10] = "abcd";
char arr2[] = "efgh";
strncpy(arr1, arr2, 2);
printf("%s\n", arr1);
return 0;
}
模拟实现
char* my_strncpy(char* dest, const char* src, int num)
{
assert(dest && src);
char* cp = dest;
while (num && (*cp++ = *src++))//将src字符串中的num个字符拷贝到cp中
{
num--;
}
while (num)//若num人大于0,则将cp中接下来的num个字符置为'\0'
{
*cp++ = '\0';
num--;
}
return dest;
}
int main()
{
char arr1[10] = "abcd";
char arr2[] = "efgh";
my_strncpy(arr1, arr2, 2);
printf("%s\n", arr1);
return 0;
}
6.strncat
作用介绍:将source中的num个字符追加到destination中
函数的使用
int main()
{
char arr1[10] = "abcd";
char arr2[] = "bcde";
strncat(arr1, arr2, 2);
printf("%s\n", arr1);
return 0;
}
模拟实现
char* my_strncat(char* s1, char* s2, int count)
{
assert(s1 && s2);
char* start = s1;
while (*s1)
{
s1++;
}
while (count--) //拷贝count个字符
{
if ((*s1++ = *s2++) == 0)//如果提前结束了,就不用再拷贝后面的\0了
return start;
}
*s1 = '\0';
return start;
}
int main()
{
char arr1[10] = "abcd";
char arr2[] = "bcde";
my_strncat(arr1, arr2, 2);
printf("%s\n", arr1);
return 0;
}
7.strncmp
作用介绍:比较说说str1和str2中num个字符
函数的使用
int main()
{
char arr1[] = "abc";
char arr2[] = "abcdefg";
if (strncmp(arr1, arr2, 3) == 0)
{
printf("=");
}
else
{
printf("!=");
}
return 0;
}
模拟实现
int my_strncmp(char* str1, char* str2, int count)
{
while (*str1 == *str2 && count--)
{
if (str1 == '\0')
return 0;
str1++;
str2++;
}
return *str1 - *str2;
}
int main()
{
char arr1[] = "abc";
char arr2[] = "abcdefg";
if (my_strncmp(arr1, arr2, 3) == 0)
{
printf("=");
}
else
{
printf("!=");
}
return 0;
}
8.strstr
作用介绍:在str1字符串中找str2字符串,找到了返回出现位置的首地址,找不到返回NULL
函数使用
int main()
{
char arr1[] = "abbbc";
char arr2[] = "bbc";
char* p = strstr(arr1, arr2);
printf("%p\n", p);
return 0;
}
模拟实现
方式一:常规方式
char* my_strstr(char* str1, char* str2)
{
assert(str1, str2);
char* s1 = NULL;
char* s2 = NULL;
char* cp = str1;
while (*cp)//cp遍历str1
{
s1 = cp;
s2 = str2;//每次都从str2第一个元素开始比较
while (*s1 && *s2 && (*s1 == *s2))
{
s1++;
s2++;
}
if (*s2 == '\0')//str2遍历
{
return cp;
}
cp++;
}
return NULL;
}
int main()
{
char arr1[] = "abbbc";
char arr2[] = "bbc";
char* p = my_strstr(arr1, arr2);
if (p != NULL)
{
printf("找到了 %s\n", p);
}
else
{
printf("找不到\n");
}
return 0;
}
方式二:strncmp进行比较
char* my_strstr(char* str1, char* str2)
{
assert(str1, str2);
int i = 0;
int len = strlen(str2);
for (i = 0; *(str1 + i); i++)//遍历str1
{
if (strncmp(*(str1 + i), *str2, len) == 0)
{
return (str1 + i);
}
}
return NULL;
}
int main()
{
char arr1[] = "abbbc";
char arr2[] = "bbc";
char* p = my_strstr(arr1, arr2);
if (p != NULL)
{
printf("找到了 %s\n", p);
}
else
{
printf("找不到\n");
}
return 0;
}
方式三:for循环遍历
char* my_strstr(char* str1, char* str2)
{
int i = 0;
for (i = 0; *(str1 + i); i++)//遍历str1
{
int j = 0;
for (j = 0; *(str2 + j); j++)//遍历str2
{
if (*(str1 + i + j) != *(str2 + j))
{
break;
}
}
if (*(str2+j) == '\0')
{
return str1 + i;
}
}
return NULL;
}
int main()
{
char arr1[] = "abbbc";
char arr2[] = "bbc";
char* p = my_strstr(arr1, arr2);
if (p != NULL)
{
printf("找到了 %s\n", p);
}
else
{
printf("找不到\n");
}
return 0;
}
9.strtok
作用介绍:分割字符串
例子:
int main()
{
char arr[] = "ydj@2948282264.qq";
char* p = "@ .";
char* ret = NULL;
for (ret = strtok(arr, p); ret != NULL; ret = strtok(NULL, p))
{
printf("%s\n",ret);
}
return 0;
}
strtok每次分割后,把分割符的位置 置为' \0 ',并保留此位置。
字符串相关的库函数就介绍到这里了,感谢您的阅读。