前言:
C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串中或者字符数组中。
字符串是c语言中最有用,最重要的数据类型之一。c的库函数里提供大量的函数用于读写字符串、拷贝字符串、比较字符串、合并字符串、查找字符串等。
下面就来介绍下一些字符串函数的介绍和使用。
strlen 函数
常量字符串中双引号里的字符在最后都会由\0来结尾。\0也是一个字符,通常我们不必刻意去加上\0,因为在被双引号引起的字符都会在末尾自动加上\0。
strlen函数也是通过\0来进行结束的。
strlen函数有什么用呢?
strlen函数用来计算在\0之前的字符有多少个。
下面就来用一下这个函数吧。
#include <stdio.h>//printf的头文件
#include <string.h>//strlen的头文件
int main()
{
char arr[] = { "abcdef" };
int len = strlen(arr);
printf("%d\n", len);
return 0;
}
结果:
![](https://img-blog.csdnimg.cn/img_convert/3f2c7a56e0a312f6e0476aa74af049bd.png)
当然我们也可以实验下strlen是不是计算\0之前的字符。
在arr里的字符中间加上\0就行了。
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = { "abc\0def" };
int len = strlen(arr);
printf("%d\n", len);
return 0;
}
结果:
![](https://img-blog.csdnimg.cn/img_convert/9a625170d8b62c6ebc7ebf081e2b233d.png)
通过实验发现strlen的确计算的是\0之前的字符。
模拟实现strlen函数
当然我们也可以来模拟实现一下strlen函数
我这里采用的是计数器的方式来进行计算的,就是在\0之前找字符,有一个字符就++一下。当遇见\0之后就退出。
那我们就来看一下代码:
#include <stdio.h>
#include <assert.h>//assert的头文件
int my_strlen(const char* str)
{
assert(str);
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{
char arr[] = { "abcdef" };
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
}
结果:
![](https://img-blog.csdnimg.cn/img_convert/47d723652652400ce060666c3726e3f6.png)
介绍完strlen函数之后,咱们再来看看strcpy函数。
strcpy函数
strcpy函数的介绍
strcpy函数是把一个字符串里的字符拷贝的另外一个字符空间里。
strcpy函数也是以\0进行结束的,但是它会把\0也一起拷贝到目标空间里。
当然使用strcpy函数也有一些要注意的地方。
1.源字符串必须以 '\0' 结束。
2.会将源字符串中的 '\0' 拷贝到目标空间。
3.目标空间必须足够大,以确保能存放源字符串。
4.目标空间必须可变。
strcpy函数使用
了解完strcmp函数之后我们就来使用一下这个函数。
我们在主函数里写两个字符数组用来存放字符,arr1是要拷贝的字符,arr2是要接收arr1拷贝过来的字符数组。当然arr2空间里必须得存放的下arr1的字符,这里就用20个字节就好啦。然后用strcpy来拷贝,strcpy函数的第一个元素是目标空间的地址,也就是arr2。第二个元素是要拷贝过去的字符地址,也就是arr1。
最后就打印arr2看一些是否拷贝进去没有咯。
看一下代码吧:
#include <string.h>//strcpy的头文件
int main()
{
char arr1[] = { "abcdef" };
char arr2[20] = { 0 };
strcpy(arr2, arr1);
printf("%s\n", arr2);
return 0;
}
结果:
![](https://img-blog.csdnimg.cn/img_convert/bf78f48a49bf6986382da31566f69718.png)
strcpy函数的实验
当然我们也可以实验一下这函数,看一下是不是拷贝的时候是不是把\0一起拷贝过去了。
可以把arr2里的内容初始化为xxxxxxxxx然后进调试看是不是真的把\0拷贝过去了。
代码:
int main()
{
char arr1[] = { "abcdef" };
char arr2[20] = { "xxxxxxxxxx" };
strcpy(arr2, arr1);
printf("%s\n", arr2);
return 0;
}
可以看见arr2里前10个字节已经被初始化为x了。
![](https://img-blog.csdnimg.cn/img_convert/713361689112957fe4cdc54b35fd42ba.png)
当我们用strcpy拷贝之后,可以看见在拷贝字符串的最后也有个\0。说明\0也被拷贝过去了。
调试结果:
![](https://img-blog.csdnimg.cn/img_convert/937b5c74dfb6f172b7329d4a1839641e.png)
模拟strcpy函数
了解完strcpy函数咱们就来模拟一下吧。
在my_strcpy过来的参数里,第一个元素就叫dest好了,第二个叫src好了。当然他们都用指针指向了起始地址的。如果要用char*来返回的话,就定义一个char*类型的ret变量来存放dest的起始地址就好了。
然后我们直接用一个while循环,把想要拷贝的字符不断赋值给 目标空间里,然后再后置++一下,先拷贝,再++,当不断赋值把\0赋值给dest时while循环判定\0为假就结束循环。然后就拷贝完成。
当然因为我们有返回值,也可以直接打印
代码:
char* my_strcpy(char* dest, const char* src)
{
assert(dest, src);
char* ret = dest;
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[] = { "abcdef" };
char arr2[20] = { "xxxxxxxxxx" };
my_strcpy(arr2, arr1);
printf("%s\n", arr2);
//当然因为我们有返回值,也可以直接打印
printf("%s\n", my_strcpy(arr2, arr1));
return 0;
}
结果:
![](https://img-blog.csdnimg.cn/img_convert/62a5a5adde0100c21aeff469fb11eb44.png)
strcat函数
strcat函数的介绍
strcat函数是将在一个字符数组的最后添加另外一个字符数组。
strcat函数是以\0的位置开始添加的。添加的时候直接覆盖\0
当然strcat也是有使用要求的
源字符串必须以 '\0' 结束。
目标空间必须有足够的大,能容纳下源字符串的内容。
目标空间必须可修改。
strcat函数的使用
int main()
{
char arr1[20] = { "hello " };
char arr2[] = { "world" };
strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
结果:
![](https://img-blog.csdnimg.cn/img_convert/1d4706417d4143e21ab204168d814c65.png)
strcat函数的实验
当然我们也可以实验下strcat函数是不是直接从\0开始追加字符。
直接在hello后边加上\0xxxxxx,然后调试一下。
int main()
{
char arr1[20] = { "hello \0xxxxxxxx" };
char arr2[] = { "world" };
strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
调试:现在还没放进去
![](https://img-blog.csdnimg.cn/img_convert/8adc0186032ebb6cf4acc57de209453b.png)
可以看见\0直接被覆盖了
![](https://img-blog.csdnimg.cn/img_convert/cb493ac2fd44f1147efc45dcb9f1ec14.png)
模拟strcat函数
这个函数也可以模拟一下
首先我们可以用while不断对my_strcat第一个元素dest进行++,当找到\0之后就停下,这个时候的第一个元素dest就指向\0,这个时候,就直接像上边strcpy函数一样拷贝就好。
当然也可以有返回函数,那么也用ret来存一下dest的首地址就好。
代码:
char* my_strcat(char* dest, const char* src)
{
assert(dest, src);
char* ret = dest;
//找到\0
while (*dest != '\0')
{
dest++;
}
//拷贝
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = { "hello \0xxxxxxxx" };
char arr2[] = { "world" };
my_strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
结果:
![](https://img-blog.csdnimg.cn/img_convert/2dddc3481b7a5e071fd5fd90afb4518b.png)
strcmp函数
strcmp函数介绍
strcmp函数是比较两个字符串
标准规定:
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
strcmp函数的使用
了解完strcmp函数之后我们就来使用一下吧。
因为strcmp函数需要一个整形来接收返回值,那就定义个int ret接收就好了。
代码:
#include <string.h>
int main()
{
char arr1[] = { "abcfe" };
char arr2[] = { "abb" };
int ret = strcmp(arr1, arr2);
printf("%d\n", ret);
return 0;
}
结果:
![](https://img-blog.csdnimg.cn/img_convert/45eeb92c5b23e469eb3ec55a71eb0d7f.png)
可以看见第一个字符串大于第二个字符串所以返回一个大于0的1回来。
如果第二个字符串也是abcfe,和第一个字符串相等那么返回的就是0咯。
模拟strcmp函数
模拟strcmp函数名就叫my_strcmp里面的第一个参数就叫str1,第二个就叫str2,
然后不断用while循环来不断比较两个字符串当,两个字符串相等时,进去判断,然后返回0,不等于就
结束循环,然后返回str1 - str2的值。两个指针相减得到的是它们之间的元素。第一个大就返回大于0的值,第二个大就返回小于0 的值。
代码:
#include <string.h>
#include <assert.h>
int my_strcmp(const char* str1, const char* str2)
{
assert(str1, str2);
while (*str1 == *str2)
{
if (*str1 == '\0')
{
return 0;
}
str1++;
str2++;
}
return *str1 - *str2;
}
int main()
{
char arr1[] = { "abcfe" };
char arr2[] = { "abb" };
int ret = my_strcmp(arr1, arr2);
printf("%d\n", ret);
return 0;
}
结果:
![](https://img-blog.csdnimg.cn/img_convert/fa59d45e47833d797086b6d0426cdbb3.png)
可以看见也很好的计算出来了。
strncpy函数
之前的一些函数还是有些不太安全的地方,比如用strcpy函数拷贝6个字符到只有3个字符空间的时候,strcpy它不会看3个字符空间到底装不装的下,它只会往里存,最后就造成了越界访问了。
所以就出现了有限制的strncpy函数,它和strcpy函数差不多,只是多一个你想拷贝多少个字符的参数。
下面就来看看这个函数的使用把。
strncpy函数的使用
int main()
{
char arr1[] = { "abcdef" };
char arr2[20] = { 0 };
strncpy(arr2, arr1, 3);
printf("%s\n", arr2);
return 0;
}
strncpy参数里的3就是你想要拷贝的字符数量。
结果:
![](https://img-blog.csdnimg.cn/img_convert/9018708f2aba9a17ad2d4fba4441eac7.png)
strncat函数
strncat函数和strcat函数大同小异,也是多一个限制而已。比如你想要拷贝4个字符到目标空间,那么就它就只会找到目标空间的\0拷贝然后覆盖\0开始拷贝,最后它也会放上\0.
strncat函数的使用
代码:
int main()
{
char arr1[20] = { "hello \0xxxxxxxxx" };
char arr2[] = { "bitabc" };
strncat(arr1, arr2, 4);
printf("%s\n", arr1);
return 0;
}
结果:
![](https://img-blog.csdnimg.cn/img_convert/eb599f206101146b86a426f2c5fc0845.png)
strncmp函数
strncmp函数也只是多一个参数,比如你想要比较3个字符串,它就只会比较前3 个字符。当然他们也会返回一定的值。
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
strncmp函数
代码:
int main()
{
char arr1[] = { "abcdef" };
char arr2[] = { "abc" };
int ret = strncmp(arr1, arr2, 3);
printf("%d\n", ret);
return 0;
}
结果:
![](https://img-blog.csdnimg.cn/img_convert/92a2831568a3d39ca055ff09bed2d043.png)
前3个字符相等所以返回0;
结尾
目前的字符串函数就介绍到这里,但是还是有一些字符串函数,这里就不一 一介绍了。
这里写的哪里有不对的地方,还请指出,我这里会进行更改,谢谢大家。