那些应该用到熟透的C语言函数

本文最后更新于:几秒前

1 字符串相关

1.1 字符串对比

strstr 用于在一个字符串中查找另一个字符串的首次出现位置。

函数原型为:char *strstr(const char *haystack, const char *needle);

这个函数接受两个参数:

  1. haystack:这是你要搜索的字符串。
  2. needle:这是你要在 haystack 中查找的字符串。

如果 needlehaystack 中找到,那么 strstr 会返回一个指向 haystackneedle 首次出现位置的指针。如果 needle 没有在 haystack 中找到,那么 strstr 会返回 NULL

例如,在代码中:

1
temp_ptr0 = strstr((char const *)temp_buffer_ptr, "MC+WAN+WIFI=");

这行代码试图在 temp_buffer_ptr 指向的字符串中查找 “MC+WAN+WIFI=”。如果找到,temp_ptr0 将指向 “MC+WAN+WIFI=” 在 temp_buffer_ptr 中首次出现的位置。如果没有找到,temp_ptr0 将被设置为 NULL

跟 strcmp 的区别:

strstrstrcmp 都是 C 语言中的字符串处理函数,但它们的功能和用途是不同的。

strstr 函数用于在一个字符串(haystack)中查找另一个字符串(needle)的首次出现位置。如果找到,strstr 返回一个指向 haystackneedle 首次出现位置的指针。如果没有找到,strstr 返回 NULL

例如:

1
2
3
char *s = "Hello, world!";
char *p = strstr(s, "world");
// p 现在指向 "world!",这是 "world" 在 s 中首次出现的位置

strcmp 函数用于比较两个字符串。如果两个字符串相等,strcmp 返回 0。如果第一个字符串在字典顺序上小于第二个字符串,strcmp 返回一个负数。如果第一个字符串在字典顺序上大于第二个字符串,strcmp 返回一个正数。

例如:

1
2
int result = strcmp("apple", "banana");
// result 现在是一个负数,因为 "apple" 在字典顺序上小于 "banana"

总的来说,strstr 用于查找字符串,而 strcmp 用于比较字符串。

1.2 类型长度

strlen 和 sizeof 的区别

strlensizeof 是 C 语言中的两个函数,它们都用于获取某种类型的“长度”,但是它们的用途和行为是不同的。

strlen 是一个函数,用于获取 C 字符串(以 ‘\0’ 结尾的字符数组)的长度。strlen 返回的是字符串中的字符数量,不包括结束的空字符 ‘\0’。

例如:

1
2
char str[] = "Hello";
printf("%zu\n", strlen(str)); // 输出:5

sizeof 是一个运算符,用于获取某种类型或对象在内存中占用的字节数。对于数组,sizeof 返回的是整个数组在内存中占用的字节数,而不是数组中的元素数量。

例如:

1
2
char str[] = "Hello";
printf("%zu\n", sizeof(str)); // 输出:6

在这个例子中,sizeof(str) 返回的是 6,因为 “Hello” 这个字符串包含 5 个字符,加上结束的空字符 ‘\0’,总共占用 6 个字节的内存。

总的来说,strlen 用于获取字符串的长度,而 sizeof 用于获取类型或对象在内存中的大小。

1.3 格式化字符串输入

对于一长串的 strcpy strcat 可以使用 snprintf 替代。

可以减少代码的复杂性,并且更加安全,因为该函数会检查输出的长度,防止缓冲区溢出。

snprintf 中的 s for string ,n for number ,该函数将会按照指定的格式生成一个字符串,并最多生成指定数量的字符,原型如下:

1
int snprintf(char *str, size_t size, const char *format, ...);
  • str:这是指向一个字符数组的指针,snprintf 将在这个数组中生成格式化的字符串。
  • size:这是 str 数组的大小。snprintf 将最多生成 size - 1 个字符,然后在字符串的末尾添加一个空字符(\0),以确保生成的字符串是以空字符结束的。
  • format:这是一个格式字符串,它定义了生成的字符串的格式。格式字符串可以包含普通的字符(它们将被直接复制到 str 中),以及格式指定符(它们以 % 开头,用于插入 snprintf 的额外参数的值)。
  • ...:这是 snprintf 的额外参数,它们的值将被插入到 str 中,取决于 format 字符串中的格式指定符。

补充:
size_t 是一种无符号整数类型,在 c 语言中主要用来表示对象的大小、数组的长度,并且以字节为单位。使用这种类型定义有如下好处:

  • 可移植,size_t 的大小会根据平台自动调整
  • 防止溢出,无符号可以防止表示负数
  • 一致性,c 语言标准库函数都会使用 size_t ,提高可读性

2 结束与换行符

0x0D 和 0x0A 是 ASCII 码的十六进制表示,它们分别对应于十进制的 13 和 10。在 ASCII 表中,0x0D 对应的字符是 CR(Carriage Return,回车,\r),0x0A 对应的字符是 LF(Line Feed,换行,\n)。

所以,0x0D 0x0A 组合在一起,通常用于表示文本中的新行。这种表示方法在 Windows 系统中常见。在 Unix 或 Linux 系统中,通常只使用 0x0A(LF)来表示新行。

而字符串的结束符是 ‘\0’,在 ASCII 中对应的十六进制是 0x00。


那些应该用到熟透的C语言函数
https://sagi-rastar.github.io/2024/01/08/那些应该用到熟透的C语言函数/
作者
SagiRastar
发布于
2024年1月8日
许可协议