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

目录

前言

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.rhkb.cn/news/322264.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BACnet到OPC UA的楼宇自动化系统与生产执行系统(MES)整合

在智能制造的浪潮下&#xff0c;一家位于深圳的精密电子制造企业面临着前所未有的挑战&#xff1a;如何高效地将楼宇自动化系统与生产执行系统&#xff08;MES&#xff09;整合&#xff0c;实现能源管理与生产流程的精细化控制。这家企业的楼宇控制系统使用的是BACnet协议&…

.OpenNJet应用引擎实践——从 0-1 体验感受

目录 一. &#x1f981; 写在前面二. &#x1f981; 安装使用2.1 安装环境2.2 配置yum源2.3 安装软件包2.4 编译代码2.5 启动 三. &#x1f981; 使用效果3.1 编辑配置文件3.2 编辑 HTML 代码 四. &#x1f981; 使用感受 一. &#x1f981; 写在前面 现在互联网体系越来越往云…

【Docker学习】docker run的端口映射-p和-P选项

docker run的端口映射选项分为-p&#xff08;小写&#xff0c;全称--publish&#xff09;&#xff0c;-P&#xff08;大写&#xff0c;全称--publish-all&#xff09;&#xff0c;之前认为只有改变容器发布给宿主机的默认端口号才会进行-p的设置&#xff0c;而不改变默认端口号…

MATLAB 基于规则格网的点云抽稀方法(自定义实现)(65)

MATLAB 基于规则格网的点云抽稀方法(自定义实现)(65) 一、算法介绍二、算法实现1.代码2.结果一、算法介绍 海量点云的处理,需要提前进行抽稀预处理,相比MATLAB预先给出的抽稀方法,这里提供一种基于规则格网的自定义抽稀方法,步骤清晰,便于理解抽稀内涵, 主要涉及到使…

为什么你创业总是失败?2024普通人如何创业?2024创业赛道!2024创业新风口!2024创业方向!2024普通人的机会!

为什么你做项目老是不赚钱&#xff0c;是你不够努力吗&#xff1f;是你运气不好吗&#xff1f; 如果都不是&#xff01;那一定是你的思维逻辑出了问题&#xff01; 先想一想你以前做的项目&#xff0c;有没有哪个符合以下条件&#xff1a;对客户有价值、寻找客源成本在可接受…

华为eNSP综合实验-网络地址转换

实验完成之后,在AR1的g0/0/1接口抓包,查看地址转换 实现私网pc访问公网pc 实验命令展示 SW1: vlan batch 12 #创建vlan interface e0/0/1 #进入接口配置vlan端口 port link-type access port default vlan 12 q interface e0/0/2 #进入接口配置vlan端口 port link-type ac…

Linux高级学习(前置 在vmware安装centos7.4)

【小白入门 通俗易懂】2021韩顺平 一周学会Linux 此文章包含第006p-第p007的内容 操作 在安装好的vmware下进行安装 这里使用的是vmware15&#xff08;win10下&#xff09;&#xff0c;win11可能无法使用15&#xff08;有几率蓝屏&#xff09;&#xff0c;换成16就行了 用迅雷…

(二刷)代码随想录第1天|704. 二分查找 27. 移除元素

704. 二分查找 704. 二分查找 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode&#xff1a;704. 二分查找_哔哩哔哩_bilibili 给定一个 n 个元素有序的&#xff08;升序&#xff09…

微信小程序个人中心、我的界面(示例四)

微信小程序个人中心、我的界面&#xff0c;九宫格简单布局&#xff08;示例四&#xff09; 微信小程序个人中心、我的界面&#xff0c;超简洁的九宫格界面布局&#xff0c;代码粘贴即用。更多微信小程序界面示例&#xff0c;请进入我的主页哦&#xff01; 1、js代码 Page({…

无意的一次学习,竟让我摆脱了Android控制?

由于鸿蒙的爆火&#xff0c;为了赶上时代先锋。到目前为止也研究过很长一段时间。作为一名Android的研发人员&#xff0c;免不了对其评头论足&#xff0c;指导文档如何写才算专业&#xff1f;页面如何绘制&#xff1f;页面如何跳转&#xff1f;有没有四大组件等等。 而Harmony…

pycharm中导入rospy(ModuleNotFoundError: No module named ‘rospy‘)

1. ubuntu安装对应版本ros ubuntu20.04可参考&#xff1a; https://wiki.ros.org/cn/noetic/Installation/Ubuntuhttps://zhuanlan.zhihu.com/p/515361781 2. 安装python3-roslib sudo apt-get install python3-roslib3.在conda环境中安装rospy pip install rospkg pip in…

pycharm调试bash启动的python项目(远程开发同理)

pycharm调试bash启动的python项目&#xff08;远程开发同理&#xff09; 步骤 打开运行/调试配置 选择Python 调试服务器 参考打开的页面&#xff0c;在需要debug的虚拟环境中安装依赖环境&#xff1a;pip install pydevd-pycharm~241.14494.158。端口号可以手动指定&…

探索鸿蒙开发:鸿蒙系统如何引领嵌入式技术革新

嵌入式技术已经成为现代社会不可或缺的一部分。而在这个领域&#xff0c;华为凭借其自主研发的鸿蒙操作系统&#xff0c;正悄然引领着一场技术革新的浪潮。本文将探讨鸿蒙开发的特点、优势以及其对嵌入式技术发展的深远影响。 鸿蒙操作系统的特点 鸿蒙&#xff0c;作为华为推…

pytorch基础: torch.unbind()

1. torch.unbind 作用 说明&#xff1a;移除指定维后&#xff0c;返回一个元组&#xff0c;包含了沿着指定维切片后的各个切片。 参数&#xff1a; tensor(Tensor) – 输入张量dim(int) – 删除的维度 2. 案例 案例1 x torch.rand(1,80,3,360,360)y x.unbind(dim2)print(&…

初学python记录:力扣1652. 拆炸弹

题目&#xff1a; 你有一个炸弹需要拆除&#xff0c;时间紧迫&#xff01;你的情报员会给你一个长度为 n 的 循环 数组 code 以及一个密钥 k 。 为了获得正确的密码&#xff0c;你需要替换掉每一个数字。所有数字会 同时 被替换。 如果 k > 0 &#xff0c;将第 i 个数字用…

Java中的异常处理机制

Java中的异常处理机制主要通过try、catch和finally三个关键字来实现。以下是Java异常处理机制的工作原理和正确处理异常的一些基本步骤&#xff1a; ## 异常处理机制的工作原理 1. **try**&#xff1a;包围可能抛出异常的代码块。 2. **catch**&#xff1a;捕获并处理特定类型…

Python | Leetcode Python题解之第70题爬楼梯

题目&#xff1a; 题解&#xff1a; class Solution:def climbStairs(self, n: int) -> int:a, b 1, 1for _ in range(n - 1):a, b b, a breturn b

前端 Android App 上架详细流程 (Android App)

1、准备上架所需要的材料 先在需要上架的官方网站注册账号。提前把手机号&#xff0c;名字&#xff0c;身份证等等材料准备好&#xff0c;完成开发者实名认证&#xff1b;软著是必要的&#xff0c;提前准备好&#xff0c;软著申请时间比较长大概需要1-2周时间才能下来&#xf…

QX-mini51单片机学习-----(3)流水灯

目录 1宏定义 2函数的定义 3延时函数 4标准库函数中的循环移位函数 5循环移位函数与左移和右移运算符的区别 6实例 7keil中DeBug的用法 1宏定义 是预处理语句不需要分号 #define uchar unsigned char//此时uchar代替unsigned char typedef是关键字 后面是接分号…

el-select 点击按钮滚动到选择框顶部

主要代码是在visibleChange 在这个 popper 里面找到 .el-select-dropdown__list let popper ref.$refs.popper const ref this.$refs.select let dom popper.querySelector(.el-select-dropdown__list) setTimeout(() > { dom.scrollIntoView() }, 800) <templat…