文章目录
0.前言
- C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在
常量字符串
中或者字符数组
中。 字符串常量
适用于那些对它不做修改的字符串函数.- 注:在使用字符串函数时,一定要在开头引用
#include <string.h>
1. strlen
strlen(超链接函数解释)
size_t strlen ( const char * str );
- 字符串以
'\0'
作为结束标志,strlen
函数返回的是在字符串中’\0’前面出现的字符个数(不包含'\0'
)。 - 参数指向的字符串必须要以
'\0'
结束。 - 注意函数的返回值为
size_t
,是无符号的! - 作用:计算字符串个数
具体实现:
2.长度不受限制的字符串函数
2.1 strcpy
strcpy(超链接函数解释)
char* strcpy(char * destination,const char * source);
- 源字符串必须以
'\0'
结束。 - 会将源字符串中的
'\0'
拷贝到目标空间。 - 目标空间必须足够大,以确保能存放源字符串。
- 目标空间必须可变。
- 作用:把数组2的字符串拷贝给字符数组1
具体实现:
- 作用:把数组2的字符串拷贝给字符数组1
2.2 strcat
strcat(超链接函数解释)
char * strcat ( char * destination, const char * source );
- 源字符串必须以
'\0'
结束。 - 目标空间必须足够大,能容纳源字符串的内容
- 目标空间必须可修改
- 作用:把数组2的字符串追加到字符数组1后,结果放在字符数组1中
- 具体实现:
2.3 strcmp
strcmp(超链接函数解释)
int strcmp ( const char * str1, const char * str2 );
-
标准规定:
- 第一个字符串大于第二个字符串,则返回大于0的数字。
- 第一个字符串等于第二个字符串,则返回0。
- 第一个字符串小于第二个字符串,则返回小于0的数字。
作用:用来比较两个字符的大小
具体实现:
3.长度受限制的字符串函数
3.1 strncpy
strncpy(超链接函数解释)
char * strncpy ( char * destination, const char * source, size_t num );
- 拷贝num个字符从源字符串到目标空间。
- 如果源字符串的长度小于num,则拷贝完源字符串后,在目标空间后边追加0,直到num个。
作用:用来比较两个字符的大小
具体实现:
3.2 strncat
strncat(超链接函数解释)
char * strncat ( char * destination, const char * source, size_t num );
- 追加num个字符到目标空间,在末尾自动补一个
'\0'
- 如果追加的字符大于源字符串数,只追加源字符串到
'\0'
位置,不会多追加或者补0
。- 作用:用来追加num个字符
具体实现:
- 作用:用来追加num个字符
3.2 strncmp
strncmp(超链接函数解释)
int strncmp ( const char * str1, const char * str2, size_t num );
- 作用:用来选择两个字符串中的num个字符进行比较
具体实现:
4.字符串查找
4.1 strstr
strstr(超链接函数解释)
char * strstr ( const char *str1, const char * str2);
- 判断str1中是否有str2字符串。如果有,则返回str2子串在str1中起始位置的地址;否则,返回NULL。
- 如果找到该子串,就会从找到的地址开始输出。
- 作用:查找字符串2在字符串1中是否存在
具体实现:
- 作用:查找字符串2在字符串1中是否存在
4.2 strtok
strtok(超链接函数解释)
char * strtok ( char * str, const char * sep );
-
set参数是个字符串,定义了用作分隔符的字符集合。
-
第一个参数指定一个字符串,它包含了0个或多个由sep字符串中一个或多个分隔符的标记。
-
strtok函数找到str中下一个标记,并将其用
'\0'
结尾,返回一个指向这个标记的指针(注:strtok函数函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改)
char arr[]="abc@qq.com";
char brr[]="@.";
strtok(arr,brr);
//把@.改为'\0';
- strtok函数的第一个参数不为
NULL
,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
char arr[]="abc@qq.com";
char brr[]="@.";
strtok(arr,brr);
//找到第一个标记
//也就是@前的字段,找到第一个字段:abc
//把@改为'\0'
//最后会记住@的地址,返回a的地址
- strtok函数的第一个参数为
NULL
,函数将在同一个字符串中被保存的位置开始,查找下一个标记。(注:在同一个字符串中查找。除了第一次找第一个参数不传NULL,后面查找每次都传NULL。)
char arr[]="abc@qq.com";
char brr[]="@.";
strtok(arr,brr);//1
strtok(NULL,brr);//2
//第一次找,找到第一个标记@,
//strtok已经记住了@的地址
//第二次找,就从@的地址继续往下找
//找到第二个标记 . 改为'\0'
//记住第二个标记的地址
//返回第二个字段首字符地址
//也就是 q 的地址
- 如果字符串中不存在更多的标记,则返回
NULL
指针。
//把brr中的分隔符都找完了,找到arr末尾了,
//就返回NULL指针
- 作用:分隔字符串
具体实现:
以上代码过于冗余,可以用循坏来简化:
可取代码:
#include <stdio.h>
#include <string.h>
int main()
{
char str1[30] = "we@are.family";//初始化数组str1
char sep[30] = "@.";//初始化数组sep
char str2[30] = "";//把str1拷贝给str2
strcpy(str2, str1);
//把"we@are.family"中@ . 改为'\0'
//更改后"we\0are\0family"
int i = 0;
char* ret = NULL;
for (ret = strtok(str2, sep); ret != NULL;ret = strtok(NULL, sep))
{
printf("%s\n", ret);
}
return 0;
}
5.错误信息报告函数
5.1strerror
char * strerror ( int errnum );
- 返回错误码所对应的错误信息
- (输出的是英文=m=,望有朝一日有大佬能让程序改成中文=w=)
- 具体实现:
6.字符分类函数
有兴趣了解可以点击查找函数
7.字符转换函数(字母大小写转换)
7.1 tolower 转小写
7.2 toupper 转大写
8.内存操作函数
8.1 memcpy
void * memcpy ( void * destination, const void * source, size_t num );
- 函数memcpy从source的位置开始向后复制num个字节数据到destination的内存位置。
- 这个函数在遇到
'\0'
的时候并不会停下来。 - 如果source和destination有任何的重叠,复制的结果都是未定义的。
- 作用:任何类型的数据都可以进行复制(不可以给自己追加)
- 具体实现:
8.2 memmove
void * memmove ( void * destination, const void * source, size_t num );
- 和
memcpy
的差别就是memmove
函数处理的源内存块和目标内存块是可以重叠的(可以自己追加自己) - 如果源空间和目标空间出现重叠,就得使用
memmove
函数处理。- 作用:任何类型的数据都可以进行复制(可以自己追加(复制)自己)
- 具体实现:
8.3 memcmp
int memcmp ( const void * ptr1,
const void * ptr2,
size_t num );
-
比较从ptr1和ptr2指针开始的num个字节
-
返回值如下
ptr1 > ptr2 则返回大于的数字
ptr1 = ptr2 则返回0
ptr1 < ptr2 则返回小于的数字
- 作用:内存单元比较,单位是字节
- 具体实现:
如果是字符在内存中进行比较,比较的是它们相对应的ASCII码值,
所以会出现 ‘A’ < ‘a’ 这种情况,因为’A’ 的ASCII码值是:65 而 ‘a’ 的ASCII码值是:97
8.4.memset
void * memset ( void * ptr, int value, size_t num );
- 从
ptr
地址开始向后修改或初始化元素 - 单位是字节
- 作用:是将某一块内存中全部设置为指定的值,单位是字节(把每个字节设置为指定的值)
- 具体实现:
- 具体实现:
- 作用:是将某一块内存中全部设置为指定的值,单位是字节(把每个字节设置为指定的值)
用
memset
来初始化int型
是做不到的,可不敢用错了!