字符串函数、内存函数——补充

目录

前言

1、strchr函数

1-1 函数介绍

1-1-1 函数功能

1-1-2 函数原型

1-1-3 函数参数

1-1-4 所属库

1-1-5 函数返回值

1-2 函数简单使用

1-3 函数使用场景

1-4 函数的使用总结

1-4-1 注意事项

2、strrchr函数

2-1 函数介绍

2-1-1 函数功能

2-1-2 函数原型

2-1-3 函数参数

2-1-4 所属库

2-1-5 函数返回值

2-2 函数的简单使用

2-3 函数使用场景

2-4 函数的使用总结

2-4-1 注意事项

3、strpbrk函数

3-1 函数介绍

3-1-1 函数功能

3-1-2 函数原型

3-1-3 函数参数

3-1-4 所属库

3-1-5 函数返回值

3-2 函数简单使用

3-3 函数使用场景

3-4 函数的使用总结

4、strcspn函数

4-1 函数介绍

4-1-1 函数功能

4-1-2 函数原型

4-1-3 函数参数

4-1-4 所属库

4-1-5 函数返回值

4-2 函数简单使用

4-3 函数使用场景

4-4 函数的使用总结

4-4-1 注意事项

5、strspn函数

5-1 函数介绍

5-1-1 函数功能

5-1-2 函数原型

5-1-3 函数参数

5-1-4 所属库

5-1-5 函数返回值

5-2 函数简单使用

5-3 函数使用场景

5-4 函数的使用总结

5-4-1 注意事项

6、memchr函数

6-1 函数介绍

6-1-1 函数功能

6-1-2 函数原型

6-1-3 函数参数

6-1-4 所属库

6-1-5 函数返回值

6-2 函数简单使用

6-3 函数使用场景

6-3 函数的使用总结

 6-3-1 注意事项

7、memcmp函数

7-1 函数介绍

7-1-1 函数功能

7-1-2 函数原型

​编辑

7-1-3 函数参数

7-1-4 所属库

7-1-5 函数返回值

7-2 函数简单使用

7-2 函数使用场景

7-3 函数的使用总结

8、经典面试题

9、字符串函数、内存函数总结


前言

字符串函数、内存函数种类很多,在实际使用的时候,会使用这些函数就行,当然下面我会详细的介绍一些做题的可能使用到的函数,这些函数不必深究,会使用即可,弄清楚函数的功能、参数、返回值即可~当然有些函数这里我未介绍,因为在之前的博客中我已经介绍,感兴趣的老铁可以看看点击这里:

c语言——内存函数详解-CSDN博客

C语言之字符函数与字符串函数详解-CSDN博客

相信看完后,你一定有所收获,一起加油吧~~


1、strchr函数

1-1 函数介绍

strchr 函数是 C 语言标准库中的一个字符搜索函数,用于在字符串中查找指定字符的第一次出现的位置。以下是 strchr 函数的介绍:

1-1-1 函数功能

定位字符串中出现的第一个字符返回指向C字符串str中第一次出现的字符的指针。

1-1-2 函数原型
 

char *strchr(const char *str, int character);

1-1-3 函数参数

- str: 指向要搜索的字符串的指针。
- character: 需要查找的字符(以整数形式)。

1-1-4 所属库

string.h

1-1-5 函数返回值

  1. - 如果找到指定的字符,则返回一个指向该字符在字符串中的地址的指针
  2. - 如果在字符串中未找到指定的字符,则返回 NULL

1-2 函数简单使用

下面简单使用一下这个函数吧~~

比如:

#include<stdio.h>
#include<string.h>
//strchr函数
int main()
{
	char arr[] = "my name is lihua";
	char* ret = strchr(arr, 's');
	printf("%s\n", ret);
	return 0;
}

输出结果:

s lihua

解析:在这个例子中,strchr函数被用来查找字符 's' 在字符串 "my name is lihua" 中的位置。如果找到了,它会打印出从该字符的位置开始之后的字符;如果没有找到,它会告知字符没有出现在字符串中。

该函数还能确定某个字符的位置

比如:

int main()
{
	char arr[] = "my name is lihua";
	char ch = 's';
	char* ret = strchr(arr, ch);
	if (ret)
	{
		printf("字符%c在字符串的位置是:%lld\n", ch, ret - arr);
	}
	else
		printf("字符%c不在字符串中\n", ch);
	return 0;
}

 输出结果

字符s在字符串的位置是:9

1-3 函数使用场景

strchr函数的使用场景可以总结为以下几点:

1. 检查字符串中是否包含特定字符:通过调用strchr函数,可以判断一个字符串中是否存在某个特定的字符。如果存在,函数会返回该字符的位置;如果不存在,则返回NULL
2. 查找特定字符在字符串中的位置:当需要知道某个字符在字符串中的确切位置时,可以使用strchr函数。这对于字符串处理和分析非常有用,比如在提取子字符串或进行其他字符串操作时。
3. 区分大小写的搜索strchr函数对大小写敏感,这意味着它会区分字符'a'和'A'。这在需要精确匹配字符时特别重要。
4. 单字节字符查找strchr函数主要用于查找单字节字符。如果需要查找多字节字符,应考虑使用wstrchr函数。
5. 简单的字符串解析:在解析简单格式的字符串时,strchr可以用来快速定位分隔符其他关键字符,从而分割字符串提取信息
6. 参数验证:在处理用户输入或配置文件时,可以使用strchr来验证是否包含非法字符或确保某些特定字符的存在。
7. 实现自定义字符串函数:在开发特定于应用程序的字符串处理函数时,strchr可以作为基础构建块,帮助实现更复杂的字符串操作。
8. 循环或递归查找:虽然strchr只能找到第一次出现的字符,但可以通过循环递归的方式使用strchr来查找所有匹配的字符
9. 与其他字符串函数结合使用strchr可以与strlen、strncpy等其他字符串函数结合使用,以实现更复杂的字符串处理任务。

1-4 函数的使用总结

(1)函数:Strchr

(2)功能:定位字符串中出现的第一个字符

(3)具体解释:返回指向C字符串str中第一次出现的字符的指针

(3)参数

         1、C字符串

         2、要定位的字符。它作为其int提升传递,但为了进行比较,它在内部被转换回char

 (3)使用场景

1、 检查字符是否存在:判断某个特定字符是否出现在字符串中
2.、获取字符位置:获取某个特定字符在字符串中的位置
3、 字符串处理:在进行字符串分割、替换等操作时,定位特定字符
4.、 验证输入:验证用户输入或配置文件中是否包含特定字符
5. 、实现自定义函数:作为构建更复杂字符串处理函数的基础

1-4-1 注意事项
  1. - strchr 函数对大小写敏感,因此 'A' 和 'a' 会被视为不同的字符
  2. - 在使用 strchr函数时,如果 str 是 NULL 或者 character不对应于有效的字符行为是未定义的
  3. - strchr 函数只能找到字符在字符串中的第一个出现位置。如果需要找到所有出现的位置,需要自己编写循环递归逻辑。
  4. -strchr是一个简单而强大的函数,它适用于各种需要在字符串中查找特定字符的场景。在使用时应考虑到其特性,如大小写敏感性对单字节字符的支持,以确保正确有效地使用该函数。

2、strrchr函数

2-1 函数介绍

strrchr函数用于查找一个字符在字符串中末次出现的位置

以下是strrchr函数的介绍~

2-1-1 函数功能

strrchr函数用于查找指定字符`c`在字符串str中最后一次出现的位置。如果找到了该字符,函数返回一个指向该字符的指针;如果没有找到,则返回NULL

2-1-2 函数原型

char *strrchr(const char *str, int c);

2-1-3 函数参数


   - str:需要搜索的字符串。
   - c:需要查找的字符。


2-1-4 所属库

string.h

2-1-5 函数返回值

  1. 如果在字符串str中找到字符`c`,则返回一个指向该字符的指针;如果未找到,则返回NULL

2-2 函数的简单使用

下面简单使用一下这个函数吧~~

比如:strrchr函数可以确定某个字符最后出现的位置~

// strrchr
#include<stdio.h>
#include<string.h>
int main()
{
	char str[] = "This is a sample string";
	char* pch = strrchr(str, 'a');
	if (pch)
		printf("Last occurence of 'a' found at %zu \n", pch - str + 1);
	else
		printf("No find!\n");
	//%zu——格式化输出size_t类型数据的占位符
	return 0;
}

输出结果

Last occurence of 'a' found at 12

解析:在上面的代码中,我们使用了strrchr函数来查找字符'a'在字符串`"This is a sample string"`中最后一次出现的位置,并输出其位置。如果字符在字符串中存在,将输出其位置;如果不存在,则输出未找到的消息。 

当然,函数可以实现查找某个字符在字符串中最后出现的位置,并打印从这个字符开始后面的字符~

比如:

int main()
{
	char str[] = "This is a sample string";
	char* pch = strrchr(str, 'a');
	if (pch)
		printf("%s\n", pch);
	else
		printf("No find!\n");
	//%zu——格式化输出size_t类型数据的占位符
	return 0;
}

输出结果

ample string
 

2-3 函数使用场景

strrchr函数主要用于查找字符串中最后一次出现的指定字符,并返回指向该字符的指针。以下是一些典型的使用场景:

1. 解析文件路径:在处理文件路径时,可能需要找到最后一个目录分隔符(如'/')的位置,以分离文件名和路径。
2. 处理字符串:在处理字符串时,可能需要找到最后一个出现的特定字符,以便进行后续的字符串操作。
3. 数据提取:在从文本中提取信息时,可能需要找到最后一个出现的关键词分隔符,以便确定数据的边界。
4. 编程竞赛:在参加编程竞赛时,strrchr可以用于解决需要查找特定字符位置的问题。
5. 系统开发:在系统开发中,strrchr可以用于解析命令行参数,找到最后一个出现的选项字符
6. 网络编程:在处理URL或其他网络资源时,可能需要找到最后一个出现的'.'字符,以确定文件扩展名。
7. 内存管理:在内存管理中,strrchr可以用于找到最后一个出现的空白字符,以便确定内存分配的结束位置
8. 用户输入验证:在验证用户输入时,strrchr可以用于检查是否包含非法字符
9. 软件测试:在软件测试中,strrchr可以用于构造测试用例,模拟特定的输入情况。
10. 安全审计:在进行安全审计时,strrchr可以帮助识别潜在的安全风险,例如检查字符串中是否包含特定的敏感字符

总的来说,strrchr函数在各种需要查找特定字符最后出现位置的场景中都非常有用,它提供了一种简洁高效的方式来完成这一任务。 

2-4 函数的使用总结

(1)函数:Strrchr

(2)功能:定位字符串中最后出现的字符

(3)具体解释:返回指向C字符串str中最后出现的字符的指针

(4)参数

1、C字符串

2、要定位的字符。它作为其int提升传递,但在内部被转换回char

2-4-1 注意事项
  1. %zu是C语言中用于格式化输出size_t类型数据的占位符
  2. 在C语言中,size_t是一种无符号整数类型,用于表示对象的大小,它在不同的系统和编译器上可能有不同的底层类型,如unsigned int或unsigned long等。size_t类型主要用于与内存分配相关的函数(如malloccalloc等)以及字符串处理函数(如strlen等)。
  3. 当使用printf函数或其他格式化输出函数来打印size_t类型的数据时,应使用%zu作为占位符,以确保正确输出该类型的值。
  4. 需要注意的是,使用%zu占位符需要C99或更高版本的C语言标准支持,因为%zu是在C99标准中引入的。在一些旧的编译器或环境中,可能需要使用其他方式来输出size_t类型的数据,比如通过转换为unsigned long类型再使用%lu占位符来输出。

3、strpbrk函数

3-1 函数介绍

strpbrk 函数用于在字符串中查找与另一字符串中的任何字符匹配的第一个字符strpbrk 是一个功能强大的函数,适用于需要在字符串中查找特定字符集中的字符的场景。它可以帮助开发者快速定位到第一个匹配的字符,从而提高字符串处理的效率和准确性。以下是strpbrk 函数介绍

3-1-1 函数功能

功能:定位字符串中的字符

3-1-2 函数原型

char * strpbrk ( char * str1, const char * str2 );

3-1-3 函数参数

- str1:要被检索的 C 字符串。
- str2:该字符串包含了要在 str1 中进行匹配的字符列表

3-1-4 所属库

string.h

3-1-5 函数返回值

  1. - 如果找到匹配的字符,则返回指向 str1 中该字符位置的指针
  2. - 如果没有找到匹配的字符,则返回 NULL。搜索不包括终止空字符(即字符串结束符 '\0')。

3-2 函数简单使用

比如查找arr1中有无arr2的元素,有的话输出相应字符~

//strpbrk
//功能:在arr1中找与arr2元素匹配的元素地址
int main()
{
	char arr1[] = "my name is lihua";
	char arr2[] = "iam";
	char* ch = strpbrk(arr1,arr2);
	while (ch)
	{
		printf("%c ", *ch);
		ch = strpbrk(ch + 1, arr2);
	}
	return 0;
}

输出结果

m a m i i a

当然该函数可以实现,查找某个字符的位置

int main()
{
	char *arr1 = "hello world";
	char *arr2 = "low";
	char* ch = strpbrk(arr1, arr2);
	if (ch)
	{
		printf("character '%c' found at passion %lld in the string\n", *ch, ch - arr1+1);
	}
	else
	{
		printf("No find\n");
	}
	return 0;
}

输出结果

character 'l' found at passion 3 in the string

在这个例子中,strpbrk 函数被用来查找字符串 "my name is lihua"(str1)中是否存在 "iam"(str2)中的任意字符。如果找到了,它会打印出该字符的位置,如果没找到,会输出没有找到。

3-3 函数使用场景

以下是strpbrk函数的一些使用场景

1. 比较两个字符串中的字符:检查两个字符串是否有相同的字符存在。
2. 查找特定字符集中的字符:在主字符串中查找是否存在某个字符集中的任意字符。
3. 实现自定义字符串处理:作为构建更复杂字符串处理功能的基础工具。

3-4 函数的使用总结

函数:Strpbrk

功能:定位字符串中的字符

具体解释:返回一个指针,指向str1中属于str2的任何字符第一次出现的位置,如果没有匹配,则返回空指针

参数

  1. 要扫描的C字符串

     2、包含要匹配的字符的C字符串


4、strcspn函数

4-1 函数介绍

strcspn函数用于计算字符串中从开头开始连续的字符数量,这些字符都不在另一个指定的字符串中。其介绍如下

4-1-1 函数功能

功能:获取span直到字符串中的字符

4-1-2 函数原型

size_t strcspn(const char *str1, const char *str2);

4-1-3 函数参数

- str1:要搜索的字符串。
- str2:包含不应出现在 str1 中的字符集的字符串。

4-1-4 所属库

string.h

4-1-5 函数返回值

  1. - 返回 str1 开头连续不含 str2 内字符的数目。如果 str1 以 str2中的字符开头,则返回 0。

4-2 函数简单使用

比如:查找arr2中的元素第一次匹配在arr1出现的位置~

//strcspn
int main()
{
	char* arr1 = "abcd123@89";
	char* arr2 = "5201314@";
	int ret = (int)strcspn(arr1, arr2);

	printf("The first number in arr1 is at position %d.\n", ret + 1);
	return 0;
}

输出结果

The first number in arr1 is at position 5.

比如:

int main()
{
	char* arr1 = "abcd123@89";
	char* arr2 = "5201314@";
	size_t ret = strcspn(arr1, arr2);

	printf("The first number in arr1 is at position %zu.\n", ret);
	return 0;
}

输出结果

The first number in arr1 is at position 4.

在这个例子中,strcspn 函数将计算字符串 "Hello, World!" 开头连续有多少个字符不在 "aeiou" 中。由于 "H" 是第一个不属于 "aeiou" 的字符,所以输出将是 "The string 'Hello, World!' starts with 1 characters not in 'aeiou'."。

4-3 函数使用场景

以下是strcspn函数的一些使用场景

1. 查找不同字符序列:确定两个字符串从头开始有多少个不同的字符。
2. 避免特定字符集:检查一个字符串的开头是否有特定字符集中的字符,并确定它们的连续长度
3. 数据验证:验证用户输入是否符合特定的格式要求,例如不包含非法字符
4. 字符串处理:在处理字符串时,可以用来分割提取不包含某些字符集的部分

4-4 函数的使用总结

函数:Strcspn

功能:获取span直到字符串中的字符

具体解释:扫描str1中第一次出现的str2中的任何字符,返回在第一次出现之前读取的str1的字符数

参数

1、要扫描的C字符串

2、包含要匹配的字符的C字符串

4-4-1 注意事项

  1. - strcspn 对大小写敏感,因此 'A' 和 'a' 会被视为不同的字符。
  2. - 如果 str1 为 NULL 或str2 为 NULL,则行为未定义
  3. - strcspn 可以用作实现自定义字符串处理功能的基础,如字符串拆分特定格式的字符串解析

5、strspn函数

5-1 函数介绍

strspn函数用于计算一个字符串中从开头开始的连续字符数量,这些字符都包含在另一个指定的字符串中。 strspn函数的介绍如下

5-1-1 函数功能

功能:获取字符串中字符集的跨度

5-1-2 函数原型

size_t strspn(const char *str1, const char *str2);

5-1-3 函数参数

- str1:要搜索的字符串。
- str2:包含应出现在str1中的字符集的字符串。

5-1-4 所属库

string.h

5-1-5 函数返回值

  1. - 返回 str1 开头连续匹配 str2中字符的数目。如果 str1 以不在 str2 中的字符开头,则返回 0。

5-2 函数简单使用

比如:查找arr1中的元素与arr2完成匹配的数目~

//strspn
int main()
{
	char arr1[] = "abcd12389";
	char arr2[] = "abcd";//初始化数~
	//数字貌似不行~
	size_t ret = strspn(arr1, arr2);

	printf("The initial number has %zu digits.\n", ret);
	return 0;
}

输出结果

The initial number has 4 digits.

还有一个样例,一起康康吧~~

int main()
{
	char arr1[] = "12378ab9";
	char arr2[] = "123456789";//初始化数~
	//数字实际可以
	size_t ret = strspn(arr1, arr2);

	printf("The initial number has %zu digits.\n", ret);
	return 0;
}

输出结果

The initial number has 5 digits.

在这个例子中,`strspn` 函数将计算字符串 "Hello, World!" 开头连续有多少个字符在 "Helo, Wrd" 中。由于 "Hello, World!" 的前5个字符 "Hello," 都在 "Helo, Wrd" 中,所以输出将是 "The string 'Hello, World!' starts with 5 characters from 'Helo, Wrd'."。

5-3 函数使用场景

以下是strspn函数的一些使用场景
1. 计算匹配字符数:确定两个字符串从第一个字符开始有多少个相同字符
2. 验证字符串前缀:检查一个字符串的开头是否由特定的字符集组成。
3. 数据过滤:在处理字符串时,可以用来提取或过滤出符合特定字符集的部分

5-4 函数的使用总结

函数:Strspn

功能:获取字符串中字符集的跨度

具体解释:返回str1的初始部分的长度,该部分仅由属于str2的字符组成

参数

1、要扫描的C字符串

2、包含要匹配的字符的C字符串

5-4-1 注意事项

  1. - strspn 对大小写敏感,因此 'A' 和 'a' 会被视为不同的字符。
  2. - 如果 str1 为 NULL 或 str2为 NULL,则行为未定义
  3. - strspn可以用作实现自定义字符串处理功能的基础,如字符串拆分或特定格式的字符串解析

6、memchr函数

6-1 函数介绍

memchr 函数用于在一段内存区域中查找指定字符的第一个出现位置。以下是 memchr 函数的详细介绍

6-1-1 函数功能

功能:在内存块中定位字符

6-1-2 函数原型

void *memchr(const void *buf, int c, size_t n);

6-1-3 函数参数

- buf:要搜索的内存区域的指针。
- c:要查找的特定字符(以整数形式)。
- n:要搜索的字节数。

6-1-4 所属库

string.h

6-1-5 函数返回值

  1. - 如果找到指定字符,则返回指向该字符在内存区域中位置的指针
  2. - 如果在指定的字节数内没有找到该字符,则返回 NULL

6-2 函数简单使用

比如:使用该函数定位某个字符的位置~

//memchr
int main()
{
	char arr[] = "hello world";
	char* ptr = memchr(arr, 'o', strlen(arr));
	if(ptr)
	printf("'p' found at position %zu.\n", ptr - arr + 1);
	return 0;
}

输出结果

'p' found at position 5.

解析:在这个例子中,memchr 函数被用来在字符串 "hello, World" 中查找字符 'o'。如果找到了,它会打印出该字符的位置;如果没有找到,它会告知字符未在内存区域中找到。

6-3 函数使用场景

以下是memchr函数的一些使用场景

1. 查找特定字符:在一块内存区域内查找某个特定字符是否存在。
2. 字符串处理:由于字符串在 C 语言中以 `\0` 结尾,可以使用 memchr来查找字符串结束符
3. 二进制数据操作:在处理二进制数据时,可以用 memchr检查是否包含特定的值或模式
4. 安全检查:检查缓冲区是否包含不安全的字符,例如空字符或其他控制字符

6-3 函数的使用总结

函数:Memchr

功能:在内存块中定位字符

具体解释:在ptr所指向的内存块的前num字节内搜索value的第一次出现(解释为unsigned char),并返回一个指向它的指针

参数

1、指向执行搜索的内存块的指针

2、待定位的值。该值作为int类型传递,但该函数使用该值的unsigned char转换执行逐字节搜索

3、要分析的字节数
Size_t是一个无符号整型

 6-3-1 注意事项

  1. - memchr可以用来查找任何类型的数据,包括非字符数据。
  2. - memchr大小写敏感,因此 'A' 和 'a' 会被视为不同的字符。
  3. - memchr 可以搜索的不仅仅是字符数据,也可以是其他类型的数据,如整型、浮点型等。
  4. - 在使用 memchr 时,确保内存区域的大小 n 正确无误,以避免潜在的缓冲区溢出问题。


7、memcmp函数

7-1 函数介绍

memcmp函数用于比较两个内存区域的内容是否相同。要使用memcmp函数,需要包含头文件<string.h>memcmp是一个功能强大的内存比较函数,它不仅可以用于比较字符串,还可以用于比较任何类型的内存块。在使用时应确保传入正确的参数,以避免潜在的错误。以下是 memcmp函数的详细介绍,一起来学习吧该函数吧~

7-1-1 函数功能

功能:比较两个内存块

7-1-2 函数原型

int memcmp(const void *s1, const void *s2, size_t n);

7-1-3 函数参数

s1s2是指向要比较的内存区域的指针,n是要比较的字节数。

const void *s1const void *s2表示输入的两个内存区域的指针,它们都应该是const类型的,以保证函数不会修改这些内存区域的内容。size_t n表示要比较的字节数,这是一个无符号整数类型。

比较范围:memcmp函数会比较指定内存区域的前n个字节,不会因为遇到空字符而停止比较,这与字符串比较函数strcmp不同。

7-1-4 所属库

string.h

7-1-5 函数返回值

  1. 如果两个内存区域的内容完全相同,则函数返回0
  2. 如果不完全相同,则返回非零值,具体取决于第一个不相同的字节
    1. 如果s1中的字节小于s2中的对应字节,则返回值小于0;
    2. 如果s1中的字节大于s2中的对应字节,则返回值大于0。

7-2 函数简单使用

使用该函数比较两个字符串~(无类型限制

//memcmp
int main()
{
	char buffer1[] = "DWgaOtP12df0";
	char buffer2[] = "DWGAOTP12DF0";


	int n = memcmp(buffer1, buffer2, sizeof(buffer1));

	if (n > 0) printf("'%s' is greater than '%s'.\n", buffer1, buffer2);
	else if (n < 0) printf("'%s' is less than '%s'.\n", buffer1, buffer2);
	else printf("'%s' is the same as '%s'.\n", buffer1, buffer2);

	return 0;
}

输出结果

'DWgaOtP12df0' is greater than 'DWGAOTP12DF0'.

7-2 函数使用场景

memcmp函数通常用于比较两块内存区域的内容,例如在实现内存复制缓存验证数据校验等操作时非常有用。以下是memcmp函数的一些典型使用场景:

  1. - 数据校验:在数据传输或存储过程中,为了确保数据的完整性和正确性,可以使用memcmp来比较源数据和目标数据的内存块是否一致。这在文件传输、缓存验证等场景中非常常见的。
  2. - 内存内容比较:当需要比较两个内存区域的内容以确定它们是否相同时,memcmp可以提供精确的比较结果。这在实现一些内存操作算法时非常有用,例如在排序算法中比较内存块的大小关系。
  3. - 安全领域:在某些安全应用中,如病毒扫描或加密算法,memcmp可以帮助检测特定模式的出现,从而识别潜在的恶意代码或进行数据解密。
  4. - 性能优化:在性能敏感的应用中,如果可以通过比较内存块来避免不必要的数据处理,那么使用memcmp可以提高程序的效率。

总的来说,memcmp是一个非常实用的函数,它在各种需要比较内存内容的场合都有广泛的应用。 

7-3 函数的使用总结

函数:Memcmp

功能:比较两个内存块

具体解释:将ptr1所指向的内存块的前num字节与ptr2所指向的前num字节进行比较,如果它们都匹配则返回0,如果不匹配则返回不同于0的值,表示哪个值更大

参数

1、指向内存块的指针

2、指向内存块的指针

3、要比较的字节数


8、经典面试题

学习了那么完了字符串函数,其中有strcpy函数,我们知道strcpy函数原型是:

char * strcpy ( char * destination, const char * source );

但思考一下:strcpy能把str_src的内容复制到str_dest,为什么还要char*类型的返回值呢?

解释:

strcpy函数返回char*类型的值主要是为了实现链式表达式,并且在某些情况下用于检查操作是否成功。具体来说:

1. 实现链式表达式:通过返回目标指针strDest,可以在一条语句中连续调用多个函数。例如,可以首先使用strcpy复制字符串,然后立即使用strlen来获取该字符串的长度,如int length = strlen(strcpy(strDest, "hello world"));。这样的链式调用可以提高代码的简洁性和可读性。
2. 内存重叠处理:如果源字符串和目标字符串有重叠部分,返回值可以用来确定操作是否成功。在strcpy的实现过程中,如果发现重叠,可以通过返回一个特定的值(比如源或目标字符串的起始地址)来表明复制操作已经完成。
3. 错误处理:返回strDest还可以作为一种简单的错误检测机制。如果strDestNULL,则表示目标缓冲区无效,此时返回NULL可以作为错误标志。
4. 兼容性:与其他字符串操作函数保持一致性,如strcatstrncpy等,这些函数也返回char*类型的值,使得它们的行为和使用方式更加一致。
5. 便于赋值和进一步操作:返回strDest允许将其赋值给其他变量或用于后续的字符串操作,如拼接、比较等。

综上所述,strcpy函数返回char*类型的值不仅有助于提高编程效率,还能在某些情况下提供额外的功能和错误处理机制。


9、字符串函数、内存函数总结

 总结如下:

        字符串就是零个或多个字符的序列,该序列以一个NUL字节结尾。字符串的长度就是它所包含的字符的数目。标准库提供了一些函数用于处理字符串,它们的原型位于头文件string.h中。

        strlen函数用于计算一个字符串的长度,它的返回值是一个无符号整数,所以把它用于表达式时应该小心strcpy函数把一个字符串从一个位置复制到另一个位置,而strcat函数把一个字符串的一份拷贝添加到另一个字符串的后面。这两个函数都假定它们的参数有效的字符串,而且如果源字符串和目标字符串出现重叠,函数的结果是未定义的。strcmp对两个字符串进行词典序的比较。它的返回值提示第1个字符串是大于、小于还是等于第2个字符串。

        长度受限的函数strncpystrncatstrncmp 都类似它们对应的不受限制版本区别在于这些函数还接受一个长度参数。在strncpy 中,长度指定了多少个字符将被写入到目标字符数组中。如果源字符串比指定长度更长,结果字符串将不会以NUL字节结尾strncat函数的长度参数指定从源字符串复制过来的字符的最大数目,但它的结果始终以一个NUL字节结尾strncmp函数的长度参数用于限定字符比较的数目。如果两个字符串在指定的数目里不存在区别,它们便被认为是相等的。

        用于查找字符串的函数有好几个。strchr函数查找一个字符串中某个字符第1次出现的位置strrchr 函数查找一个字符串中某个字符最后一次出现的位置strpbrk函数是在一个字符串中查找一个指定字符集中任意字符第1次出现的位置strstr函数是在一个字符串中查找另一个字符串第1次出现的位置

        标准库还提供了一些更加高级的字符串查找函数strspn 函数计算一个字符串的起始部分匹配

        一个指定字符集中任意字符的字符数量strcspn 函数计算一个字符串的起始部分不匹配一个指定字符集中任意字符的字符数量strtok函数把一个字符串分割成几个标记。每次当它调用时,都返回一个指向字符串中下一个标记位置的指针。这些标记由一个指定字符集的一个或多个字符分隔。strerror函数把一个错误代码作为它的参数。它返回一个指向字符串的指针,该字符串用于描述这个错误

        标准库还提供了各种用于测试和转换字符的函数。使用这些函数的程序比那些自己执行字符测试和转换的程序更具移植性。toupper 函数把一个小写字母字符转换为大写形式,tolower函数则执行相反的任务。iscntrl函数检查它的参数是不是一个控制字符isspace函数测试它的参数是否为空白字符isdigit 函数用于测试它的参数是否为一个十进制数字字符isxdigit 函数则检查它的参数是否为一个十六进制数字字符islowerisupper函数分别检查它们的参数是否为大写小写字母。isalpha 函数检查它的参数是否为字母字符isalnum 函数检查它的参数是否为字母或数字字符ispunct函数检查它的参数是否为标点符号字符。最后,isgraph函数检查它的参数是否为图形字符isprint函数检查它的参数是否为图形字符空白字符

        memxxx函数提供了类似字符串函数的能力,但它们可以处理包括NUL 字节在内的任意字节。这些函数都接受一个长度参数memcpy从源参数向目标参数复制由长度参数指定的字节数memmove 函数执行相同的功能,但它能够正确处理源参数目标参数出现重叠的情况。memcmp 函数比较两个序列的字节memchr函数在一个字节序列中查找一个特定的值。最后,memset 函数把一序列字节初始化为一个特定的值。


警告的总结
1.应该在使用有符号数的表达式中使用strlen函数。
2.在表达式中混用有符号数无符号数
3.使用strcpy函数把一个长字符串复制到一个较短的数组中,导致溢出
4.使用strcat函数把一个字符串添加到一个数组中,导致数组溢出
5.把strcmp函数的返回值当作布尔值进行测试。


6.把strcmp函数的返回值与1和﹣1进行比较
7.使用并非以NUL字节结尾的字符序列
8.使用strncpy函数产生不以NUL字节结尾的字符串
9.把strncpy函数和strxxx族函数混用。
10.忘了strtok函数将会修改它所处理的字符串
11.strtok函数是不可再入的。


 编程提示的总结
1.不要试图自己编写功能相同的函数来取代库函数。

2.使用字符分类和转换函数可以提高函数的移植性。

制作不易一键三联吧~~

老铁们,看官们~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/586911.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu入门

基础命令 cd 切换命令 ls 查看当前目录下所有的文件 cp a.c b.c 拷贝a.c 到 b.c touch a.c 创建a.c文件 mkdir file 创建文件夹file rm file 删除文件 rmdir 删除test文件夹 rmdir test/ mv 移动文件 mv a.c b.c 把a.c 替换成b.c ifconfig 查看电脑网络信息 rm xx 删…

人工电销机器人在销售行业中的重要性和作用,以及未来市场的发展前景

在追求更高效、更智能的时代&#xff0c;各行各业都在积极寻求新技术、新应用来提升业务流程的效率和质量。对于销售行业而言&#xff0c;人工电销机器人已经成为越来越受欢迎的工具之一。我们将深入探讨人工电销机器人在销售行业中的重要性和作用&#xff0c;以及未来市场的发…

31.Gateway网关-跨域问题

跨域 1.域名不同&#xff1a;www.baidu.com和www.taobao.com,www.taobao.org 2.域名相同&#xff0c;端口不同。localhost:8080和localhost:8081 跨域问题 浏览器禁止请求的发起者与服务端发生跨域ajax请求&#xff0c;请求被浏览器拦截的问题。 解决方案 CORS 浏览器询…

linux安装Redis 7.2.4笔记

一.保姆级安装 1.下载Redis 7.2.4安装包 sudo wget https://download.redis.io/releases/redis-7.2.4.tar.gz2.解压&#xff0c;可以指定 sudo tar -zvxf redis-7.2.4.tar.gz 3.检测并安装 GCC 编译器&#xff1a; yum 是基于 Red Hat 的 Linux 发行版&#xff08;如 CentOS、…

【webrtc】MessageHandler 5: 基于线程的消息处理:以PeerConnection信令线程为例

peerconn的信令是通过post 消息到自己的信令线程消息来处理的PeerConnectionMessageHandler 是具体的处理器G:\CDN\rtcCli\m98\src\pc\peer_connection_message_handler.hMachinery for handling messages posted to oneself PeerConnectionMessageHandler 明确服务于 signalin…

分布式与一致性协议之Raft算法(四)

Raft算法 Raft是如何解决成员变更问题的 在日常工作中&#xff0c;你可能会遇到服务器故障的情况&#xff0c;这时你需要替换集群中的服务器。如果遇到需要改变数据副本数的情况&#xff0c;则需要增加或移除集群中的服务器。总的来说&#xff0c;在日常工作中&#xff0c;集…

进一步了解android studio 里 AGP,gradle等关系

目录 &#xff08;1&#xff09; gradle是什么 &#xff08;2&#xff09; 工程的jdk版本&#xff0c;及引用包的编译版本的关系 实践 问题与解决 编译成功与运行成功 编译成功 运行成功 &#xff08;1&#xff09; gradle是什么 Gradle是一个构建工具&#xff0c;它是…

Mac 版 安装NVM

优质博文IT-BLOG-CN NVM&#xff08;Node Version Manager&#xff09;是一个用于管理多个Node.js版本的工具。它允许开发者在同一台机器上安装和切换不同版本的Node.js&#xff0c;以便在不同的项目中使用不同的Node.js版本。macOS用户可以使用homebrew来安装NVM。 一、安装h…

Swagger3.0(Springdoc)日常使用记录

文章目录 前言一、默认地址二、注解OperationTag 三、SpringBoot基础配置四、Swagger导入apifox五、Swagger其他配置六 knife4j 参考文章 前言 本文并不是Swagger的使用教程&#xff0c;只是记录一下本人的操作&#xff0c;感兴趣的可以看下 一、默认地址 http://localhost:…

Scala 多版本下载指南

Scala&#xff0c;这一功能丰富的编程语言&#xff0c;结合了面向对象和函数式编程的精华&#xff0c;为开发者提供了强大的工具来构建高效、可扩展的应用程序。随着Scala社区的不断壮大和技术的演进&#xff0c;多个版本的Scala被广泛应用于不同的项目与场景中。本文旨在为您提…

Redis集群模式:高可用性与性能的完美结合!

【更多精彩内容,欢迎关注小米的微信公众号“软件求生”】 大家好,我是小米,一个积极活泼、喜好分享技术的29岁程序员。今天我们来聊聊Redis的集群模式,以及它是如何实现高可用的。 什么是Redis集群模式? Redis的集群模式是为了避免单一节点负载过高导致不稳定的一种解决…

Rust Web开发实战:构建高效稳定的服务端应用

如果你厌倦了缓慢、占用大量资源且不稳定的模板化Web开发工具&#xff0c;Rust就是你的解决方案。Rust服务提供了稳定的安全保证、非凡的开发经验&#xff0c;以及能够自动防止常见错误的编译器。 《Rust Web开发》教你使用Rust以及重要的Rust库(如异步运行时的Tokio、用于Web…

3.C++动态内存管理(超全)

目录 1 .C/C 内存分布 2. C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free 3. C内存管理方式 3.1 new/delete操作内置类型 3.2 new和delete操作自定义类型 3.3 operator new函数 3.4 定位new表达式(placement-new) &#xff08;了解&#xff09; 4. 常…

公共 IP 地址与私有 IP 地址区别有哪些?

​  IP 地址是分配给互联网上每个设备的唯一数字 ID。 IP 地址可以在 Internet 上公开使用&#xff0c;也可以在局域网 (LAN)上私有使用。本文&#xff0c;我们主要探讨公共 IP 地址和私有 IP 地址之间的区别。 公共IP地址&#xff1a;公共IP地址是用于访问Internet的向外的I…

极简shell制作

&#x1f30e;自定义简单shell制作 &#xff08;ps: 文末有完整代码&#xff09; 文章目录&#xff1a; 自定义简单shell制作 简单配置Linux文件 自定义Shell编写 命令行解释器       获取输入的命令       字符串分割       子进程进行进程替换 内建命令…

WebP格式:图片压缩的新标准

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

qcheckbox互斥 也就是单选 纯代码实现 没有ui界面转到槽

1.init&#xff08;&#xff09;函数把所有的qcheckbox找到&#xff0c;然后通过信号与槽&#xff0c;做到点击哪个qcheckbox&#xff0c;哪个qcheckbox就发出信号 2.checkchange&#xff08;&#xff09;槽函数&#xff0c;通过42行拿到是哪个qcheckbox发出的信号&#xff0c…

Kubernetes 弃用Docker后 Kubelet切换到Containerd

containerd 是一个高级容器运行时&#xff0c;又名 容器管理器。简单来说&#xff0c;它是一个守护进程&#xff0c;在单个主机上管理完整的容器生命周期&#xff1a;创建、启动、停止容器、拉取和存储镜像、配置挂载、网络等。 containerd 旨在轻松嵌入到更大的系统中。Docke…

Python 深度学习(三)

原文&#xff1a;zh.annas-archive.org/md5/98cfb0b9095f1cf64732abfaa40d7b3a 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第八章&#xff1a;深度学习与电脑游戏 上一章关注的是解决棋盘游戏问题。在本章中&#xff0c;我们将研究更复杂的问题&#xff0c;即训练…

深入探究C++四大关键特性:初始化列表、友元函数、内部类与static成员

目录 1. 构造函数不为人知的那些事 1.1 构造函数体赋值与初始化列表对比 1.2 explicit关键字与构造函数隐式转换 2. static成员 2.1 static成员的概念 2.2 static成员的特性与应用 2.3 小结 3. C11 成员变量初始化新用法 4. 友元 4.1 友元函数 4.2 友元类 5. 内部类…
最新文章