【C语言笔记分享】字符函数和字符串函数(建议收藏)

0.前言

  1. C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串 中或者 字符数组 中。
  2. 字符串常量 适用于那些对它不做修改的字符串函数.
  3. 注:在使用字符串函数时,一定要在开头引用#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.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个字符
      具体实现:
      在这里插入图片描述

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中是否存在
      具体实现:
      在这里插入图片描述

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

strerror

char * strerror ( int errnum );
  • 返回错误码所对应的错误信息
  • (输出的是英文=m=,望有朝一日有大佬能让程序改成中文=w=)
    • 具体实现:

在这里插入图片描述

6.字符分类函数

有兴趣了解可以点击查找函数

在这里插入图片描述

7.字符转换函数(字母大小写转换)

7.1 tolower 转小写

在这里插入图片描述

7.2 toupper 转大写

在这里插入图片描述

8.内存操作函数

8.1 memcpy

memcpy

void * memcpy ( void * destination, const void * source, size_t num );
  • 函数memcpy从source的位置开始向后复制num个字节数据到destination的内存位置。
  • 这个函数在遇到'\0'的时候并不会停下来。
  • 如果source和destination有任何的重叠,复制的结果都是未定义的。
    • 作用:任何类型的数据都可以进行复制(不可以给自己追加)
    • 具体实现:
      在这里插入图片描述

8.2 memmove

memmove

void * memmove ( void * destination, const void * source, size_t num );
  • memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的(可以自己追加自己)
  • 如果源空间和目标空间出现重叠,就得使用memmove函数处理。
    • 作用:任何类型的数据都可以进行复制(可以自己追加(复制)自己)
    • 具体实现:
      在这里插入图片描述

8.3 memcmp

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

memset

void * memset ( void * ptr, int value, size_t num );
  • ptr地址开始向后修改或初始化元素
  • 单位是字节
    • 作用:是将某一块内存中全部设置为指定的值,单位是字节(把每个字节设置为指定的值)
      • 具体实现:
        在这里插入图片描述

memset来初始化int型是做不到的,可不敢用错了!

评论 45
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bushi橙子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值