目录
strlen
strcpy
stcat
strstr
strcmp
前言:大家好,本章主要分享的是了解、使用、模拟实现以上字符函数和字符串函数
strlen
计算字符串的长度
size_t strlen(const char* str);
size_t//返回的是无符号整数
char*str//接受的是要计算字符串的首字符的地址,const修饰保证字符串不被修改
注意:1、字符串要以‘\0’作为结束标志,strlen函数返回的是在字符串中‘\0’前面出现的字符个数(不包含‘\0’)。
参数指向的字符串必须要以‘\0’结束。
注意函数的返回值为size_t,是无符号的整数。(易错)
学会strlen函数的模拟实现。
先看看是如何使用的
#include<stdio.h>
#include<string.h>
int main()
{
char ch[] = "abcdef";
int ret = strlen(ch);
printf("%d\n", ret);
}
![](https://i-blog.csdnimg.cn/blog_migrate/ec3da5f637e74fa23c478ee78d8bd604.png)
因为字符串中‘\0’之前字符有6个,所以返回的是6。
接下来在通过模拟实现看看
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* str)
{
assert(str);
size_t count = 0;
while (*str++)
{
count++;
}
return count;
}
int main()
{
char ch[] = "abcdef";
size_t ret = my_strlen(ch);
printf("%u\n", ret);
return 0;
}
注意:1.const修饰指针为了保证指针不被修改。
2.assert是断言,保证指针的有效性。(后面类似,不再解释)
3.要的头文件都是string.h
2、strcpy
拷贝字符串
char* strcpy(char* destination, const char* source)
char*//返回的是目标字符串的首元素地址
char* destination//目标字符串的起始地址
char*source//来源字符串的起始地址
注意:1、原子符串必须要以‘\0’结束。
2、会将字符串中的‘\0’拷贝到目标空间。
3、目标空间必须足够大,以确保存放原子符串。
4、目标空间必须可变
5、学会模拟实现
先看看使用
#include<stdio.h>
#include<string.h>
int main()
{
char ch1[20] = "############";
char ch2[] = "abcdef";
strcpy(ch1, ch2);
printf("%s\n", ch1);
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/f1f3570358666112157974893b24b202.png)
注意:目标空间的必须足够大,这是写代码的我们必须知道的
再来看看如何实现
#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char ch1[] = "abcdef";
char ch2[] = "#################";
printf("%s\n", my_strcpy(ch2, ch1));
return 0;
3、strcat
追加字符串
char* strcat(char* destination, const char* source);
char*//返回的是目标字符串的起始地址
char*destination//目标字符串的起始地址
char*source//源字符串的起始地址
注意:1、源字符串必须以‘\0’结束。
2、目标空间必须有足够的大,能容纳下源字符串的内容。
3、目标空间必须可修改。
先来看看使用
#include<stdio.h>
#include<string.h>
int main()
{
char ch1[20] = "abc";
char ch2[] = "defg";
strcat(ch1, ch2);
printf("%s\n", ch1);
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/cfb3f0d2972552a81e6c459e549777c6.png)
接下来看看模拟实现
#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;
while(*dest)
{
dest++;
}
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char ch1[20] = "abc";
char ch2[] = "defg";
printf("%s\n", my_strcat(ch1, ch2));
return 0;
}
注意:这个模拟实现,追加两个不同字符串的时候是可行的,不过当你自己给自己追加的时候,就会无限循环下去。
那要怎么自己给自己追加呢?
那就要请出我们的strncat。(这既然是一个问句,就留给你们回答吧)
4、strstr
在一个字符串中查找另一个字符串
const char* strstr(const char* str1, const char* str2);
char*//如果str1中有字符str2,则返回str1中出现str2首字符地址,找不到返回空指针
char*str1//被查找的字符串的首字符地址
char*str2//要查找字符串的首字符地址
那看看怎么使用吧
#include<stdio.h>
#include<string.h>
int main()
{
char ch1[] = "abcdefg";
char ch2[] = "abcq";
char* p1=strstr(ch1, ch2);
if(p1!=NULL)
printf("找到了为:%s\n", p1);
else
{
printf("找不到\n");
}
return 0;
}
这个函数实现起来有点小复杂,不过还是可以实现的。
#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strstr( char* str1, char* str2)
{
assert(str1 && str2);
//引入两个指针,记住一个地址,防止找不到下一个要遍历的地址
char* pa = str1;
char* pc = NULL;
while (*pa)
{
pa = str1;
pc = str2;
while (pa && pc && *pa == *pc)
{
pa++;
pc++;
}
if (*pc == '\0')//说明已经找完str2的字符并找到了
{
return str1;
}
str1++;
}
return NULL;
}
int main()
{
char ch1[] = "abcdefg";
char ch2[] = "abc";
char* p1=my_strstr(ch1, ch2);
if(p1!=NULL)
printf("找到了为:%s\n", p1);
else
{
printf("找不到\n");
}
return 0;
}
5、strcmp
字符串的比较
int strcmp(const char* str1, const char* str2);
int//如果str1字符串比str2字符串大返回大于0的数,比它小返回小于0的数,相等返回0
char*str1//第一个要比较的字符串的首元素地址
char*str2//第二个要比较的字符串的首元素地址
注意:1、第一的字符串大于第二个字符串,则返回大于0的数字(在VS中返回1,其他编译器不一定)
2、第一的字符串等于第二个字符串,则返回0
3、第一个字符串小于第二个字符串,则返回小于0的数字(在VS中返回-1)
函数的使用
#include<stdio.h>
#include<string.h>
int main()
{
char ch1[] = "abcdef";
char ch2[] = "abcq";
int ret = strcmp(ch1, ch2);
printf("%d\n", ret);
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/cf110e391c268474aaf46edd69d81287.png)
函数的模拟实现
#include<stdio.h>
#include<string.h>
int my_strcmp(const char* str1, const char* str2)
{
while (*str1 == *str2)
{
str1++;
str2++;
}
if (*str1 > *str2)
{
return 1;
}
else if (*str1 < *str2)
{
return -1;
}
else
{
return 0;
}
}
int main()
{
char ch1[] = "abcdef";
char ch2[] = "abcq";
int ret = my_strcmp(ch1, ch2);
printf("%d\n", ret);
return 0;
}
好了,今天先分享这几个函数,学会的可以去,试试看哦!有不懂的,可以在评论区留言哦!