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

news/2024/5/20 12:05:19

目录

前言

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);}elseprintf("字符%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);elseprintf("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);elseprintf("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.mrgr.cn/p/44400821

相关文章

微信小程序导出Excel文件并转发给好友

需求: 小程序的列表页面增加导出功能,点击“批量导出”按钮,则自动生成导出文件,然后自动调起微信好友列表,然后可以将文件发送给微信好友 解决方案: 由于列表数据是分页加载,所以导出直接由后端同学进行生成并返回url,则我们前端同学只负责下载wx.downloadFile并转发wx…

线段树专题

落谷1607 #include<bits/stdc.h> using namespace std;#define ls u<<1 #define rs u<<1|1const int N 1e5;int n, k, c, ans; struct line {int l, r, m; // m为候车的牛的数量bool operator<(line b) {return r < b.r;} }s[N];struct tree {int l, …

前端报错

一、加载控制台报错,但功能好像还都正确。 原因:组件还没加载就访问,是会报类似如下的错

uniapp怎么使用jsx

安装vitejs/plugin-vue-jsx npm install vitejs/plugin-vue-jsx -Dvite.config.js配置 import { defineConfig } from "vite"; import uni from "dcloudio/vite-plugin-uni"; import vueJsx from vitejs/plugin-vue-jsxexport default defineConfig({plu…

在云打印服务平台上打印资料有什么优势?

随着移动互联网和电子商务的发展,现在有越来越多的用户选择在网上购物。而对于学生们来说,现在也有越来越多的同学们开始去网上打印。而云打印的出现,让这些网上打印资料的学生选择了云打印服务。那么在云打印服务平台上打印资料有什么优势?今天小易就带大家来了解一下。 在…

GitLab使用记录

GitLab 文章目录 1. 常用命令1.1 配置邮箱 用户名1.2 查看配置1.3 基本语法 2. 连接gitlab3. 直接拉去项目 1. 常用命令 1.1 配置邮箱 用户名 git config --global user.name ShangzheChen git config --global user.email 735511377qq.com1.2 查看配置 cat ~/.gitconfig这…

labview技术交流-将时间字符串转换成时间格式

应用场景 我们在数据库中设计了datetime类型的字段&#xff0c;比如字段名就叫“保存时间”&#xff0c;当我们使用labview将表中数据读取出来后datetime类型的数据是以字符串的格式显示的。而我们想计算两条数据“保存时间”的间隔时间时&#xff0c;用字符串类型自然是没法计…

JMeter + ant + Jenkins 接口测试持续集成

JMeter + ant + Jenkins 接口测试持续集成 操作系统:linux环境变量 地址jdk11 https://www.oracle.com/java/technologies/downloads/jmeter 5.6 https://jmeter.apache.org/ant 1.10.14 https://ant.apache.org/bindownload.cgiJenkins 2.414.1 https://mirrors.jenkins.io/一…

云打印怎么保护用户的隐私?

随着互联网的发展,在当下的网络环境下,用户的隐私越来越难以保证安全。特别是对于打印业务来说,盗取用户文件、转卖客户信息的内容时有发生。那么我们作为出色的云打印服务商,该如何保证用户的隐私呢?今天就来给大家介绍一下。 当前打印市场乱象 在当下的网络环境下,我们…

How Linux Works I - How Linux Start Up

目录 Linux如何启动&#xff1f; 启动信息 内核启动初始化与启动选项 写在前面&#xff1a;上一个专栏中我写完了内核源码层面看Linux&#xff0c;我们把抽象层拉高一点&#xff0c;看看Linux是如何工作的&#xff01; Linux如何启动&#xff1f; BIOS&#xff08;Basic Inpu…

从技术谈到管理,把系统优化的技术用到企业管理

管理工作是什么呢 很多技术人员在职业上对自己要求高&#xff0c;工作勤奋&#xff0c;承担越来越大的责任&#xff0c;最终得到信任&#xff0c;被提拔到管理岗位。但是往往缺乏专业的管理知识&#xff0c;在工作中不能从整体范围优化工作流程&#xff0c;仍然是“个人贡献者…

“人工智能+”推进新质生产力发展论坛暨工作室实践实训基地授牌仪式圆满结束

4月27日&#xff0c;由江西财经大学现代经济管理学院主办的“人工智能”推进新质生产力发展论坛暨“江财现经管泰迪数智技术”校企工作室实践实训基地授牌仪式在江西财经大学现代经济管理学院共青城校区举行&#xff0c;学院院长王金海&#xff0c;副院长丁美东&#xff0c;副院…

如何将pdf文件换成3d模型?---模大狮模型网

PDF文件是一种广泛用于文档传输和共享的格式&#xff0c;但在某些情况下&#xff0c;我们可能希望将其中的内容转换为更具交互性和视觉效果的3D模型。本文将介绍如何将PDF文件转换为3D模型&#xff0c;为您展示实现这一想象的步骤。 选择合适的PDF文件&#xff1a; 首先&#…

你的许可证不是正版,你可能是盗版软件的受害者?

你的许可证不是正版,你可能是盗版软件的受害者? 问题分析 有的用户在使用 Office 时可能会遇到许可证问题,可能是弹窗,也有可能是横幅。 我们不讨论以前是什么样,现在是这样的: 微软为了遏制 KMS 盗版过于横行,封禁了使用 KMS 工具进行激活的手段,因为使用 KMS 工具激活…

Go-Zero自定义goctl实战:定制化模板,加速你的微服务开发效率(四)

gozero如何自定义goctl?本文详解和实战,通过本文你将了解goctl的妙用,提高你的开发效率。介绍如何使用goctl工具实现模板定制化,并根据实际项目业务需求进行模板定制化实现。前言 上一篇文章带你实现了Go-Zero和goctl:解锁微服务开发的神器,快速上手指南,本文将继续深入…

插入法(直接/二分/希尔)

//稳定耗时&#xff1a; 双向冒泡&#xff0c;可指定最大最小值个数MaxMinNum<nsizeof(Arr)/sizeof(Arr[0]), void BiBubbleSort(int Arr[],int n&#xff0c;int MaxMinNum){int left0,rightn-1;int i;bool notDone true;int temp;int minPos;while(left<right&&am…

智慧旅游推动旅游服务智慧化转型:借助智能科技的力量,实现旅游资源的精准匹配和高效利用,为游客提供更加便捷、舒适的旅游环境

目录 一、引言 二、智慧旅游的定义与特点 &#xff08;一&#xff09;智慧旅游的定义 &#xff08;二&#xff09;智慧旅游的特点 三、智能科技在旅游服务中的应用 &#xff08;一&#xff09;大数据分析助力旅游决策 &#xff08;二&#xff09;人工智能实现个性化推荐…

1、安装terminator分屏工具

1 安装分屏工具terminator 打开ubuntu自带终端,输入sudo apt-get install terminator命令安装分屏工具terminator。 再重新打开ubuntu自带终端,在屏幕上右击

【GaussDB(for MySQL)】 Big IN查询优化

在生产环境中,经常会遇到客户业务的SQL语句进行过滤查询,然后进行聚合处理,并且IN谓词列表中包含几千甚至上万个常量值。本文分享自华为云社区《【MySQL技术专栏】GaussDB(for MySQL) Big IN查询优化》,作者:GaussDB 数据库。背景介绍在生产环境中,经常会遇到客户业务的S…