24 C 语言常用的字符串处理函数详解:strlen、strcat、strcpy、strcmp、strchr、strrchr、strstr、strtok

目录

1 strlen

1.1 函数原型

1.2 功能说明

1.3 案例演示

1.4 注意事项

2 strcat

2.1 函数原型

2.2 功能说明

2.3 案例演示

2.4 注意事项

3 strcpy

3.1 函数原型

3.2 功能说明

3.3 案例演示

3.4 注意事项

4 strcmp

4.1 函数原型

4.2 功能说明

4.3 案例演示

4.4 注意事项

5 strchr

5.1 函数原型

5.2 功能说明

5.3 案例演示

5.4 注意事项

6 strrchr

6.1  函数原型

6.2 功能说明

6.3 案例演示

6.4 注意事项

7 strstr

7.1 函数原型

7.2 功能说明

7.3 案例演示

7.4 注意事项

8 strtok

8.1 函数原型

8.2 功能说明

8.3 案例演示

8.4 注意事项

9 总结对比表


1 strlen

1.1 函数原型

        strlen 函数是 C 语言标准库中的一个函数,用于计算字符串的长度(不包括终止的空字符 '\0')。其函数原型定义在 <string.h> 头文件中。

#include <string.h>  
size_t strlen(const char *str);
  • 参数:const char *str指向以 null 结尾的字符串的指针
  • 返回值:size_t表示字符串的长度,即不包括终止的空字符 '\0' 的字符数。最好使用 %zu 进行打印输出。

1.2 功能说明

        strlen 函数遍历传入的字符串,直到遇到第一个空字符 '\0' 为止,并返回遍历过程中遇到的字符数(不包括 '\0')。这个函数对于处理 C 语言中的字符串非常有用,因为 C 语言中的字符串是以空字符 '\0' 结尾的字符数组

1.3 案例演示

#include <stdio.h>
#include <string.h>int main()
{char str[] = "Hello,World!";printf("字符串 '%s' 的长度是:%zu,sizeof(str)=%zu\n", str, strlen(str), sizeof(str));// 演示空字符串的情况char emptyStr[] = "";printf("空字符串 '%s' 的长度是:%zu,sizeof(emptyStr)=%zu\n", emptyStr, strlen(emptyStr), sizeof(emptyStr));// 演示包含空格的字符串char spaceStr[] = "Hello World";printf("包含空格的字符串 '%s' 的长度是:%zu,sizeof(spaceStr)=%zu\n", spaceStr, strlen(spaceStr), sizeof(spaceStr));return 0;
}

        输出结果如下所示:

1.4 注意事项

        不包含终止符strlen 返回的长度不包括字符串末尾的空字符 '\0'

        参数检查:使用 strlen 时,应确保传入的指针不是 NULL,否则会导致未定义行为(通常是程序崩溃)。

        性能考虑:由于 strlen 需要遍历整个字符串直到找到 '\0',因此其性能与字符串的长度成正比。在处理非常长的字符串时,应考虑性能影响。

        修改字符串:虽然 strlen 的参数是 const char *,意味着理论上不应修改字符串,但在实际编程中,确保在调用 strlen 后不修改字符串,因为后续操作可能依赖于字符串的原始内容。

        替代方案:在某些情况下,如果已知字符串的最大长度,或者字符串存储在固定大小的数组中,可以考虑使用数组的大小作为长度,而不是调用 strlen。这可以避免运行时开销,并可能提高性能。

        安全性:在处理来自不可信源的字符串时,应确保字符串不会超出预期的长度,以避免缓冲区溢出等安全问题。


2 strcat

2.1 函数原型

        strcat 函数是 C 语言标准库中的一个函数,用于将两个字符串连接起来。其函数原型定义在 <string.h> 头文件中。

#include <string.h>  
char *strcat(char *dest, const char *src);
  • 参数:
    • char *dest:指向目标字符串的指针,即要连接到的字符串。这个字符串必须有足够的空间来存储两个字符串连接后的结果
    • const char *src:指向源字符串的指针,即要连接到目标字符串末尾的字符串
  • 返回值:返回指向目标字符串(dest)的指针

2.2 功能说明

        strcat 函数将 src 字符串(终止的空字符 '\0' 之前的所有字符)追加到 dest 字符串的末尾(原来存放 '\0' 的位置),并自动在结果字符串的末尾添加一个新的空字符 '\0'如果 dest 和 src 指向的字符串重叠,则行为是未定义的

2.3 案例演示

#include <stdio.h>
#include <string.h>int main()
{char dest[20] = "Hello, ";const char *src = "World!";// 使用 strcat 连接字符串strcat(dest, src);// 输出连接后的字符串printf("连接后的字符串是:%s\n", dest);return 0;
}

        输出结果如下所示:

        字符串初始化完成后的存储情况,如下所示:

        使用 strcat 追加字符串后,目标字符串内容如下所示:

2.4 注意事项

        空间足够确保目标字符串 dest 有足够的空间来存储两个字符串连接后的结果,包括额外的终止空字符 '\0'。如果空间不足,将导致缓冲区溢出,这是常见的安全问题。

        重叠字符串如果 dest 和 src 指向的字符串内存区域重叠,则 strcat 的行为是未定义的。在这种情况下,应使用 strncat 或其他安全的字符串处理函数。

        空字符串如果 src 是空字符串(即仅包含 '\0'),则 dest 字符串不会改变,但函数仍然会返回 dest 的指针。

        返回值:虽然 strcat 的返回值通常不是必需的,但了解它返回的是 dest 的指针可以在某些情况下简化代码。

        安全性:在处理来自不可信源的字符串时,应特别小心,以避免缓冲区溢出等安全问题。考虑使用 strncat 或其他更安全的字符串处理函数。

        终止符strcat 会自动在连接后的字符串末尾添加一个新的终止空字符 '\0'。这是确保字符串正确结束的关键。

        性能:strcat 需要遍历 dest 字符串以找到其末尾的空字符,然后才能开始追加 src 字符串。因此,其性能与 dest 字符串的长度成正比。在处理非常长的字符串时,应考虑性能影响。


3 strcpy

3.1 函数原型

        strcpy 函数是 C 语言标准库中的一个函数,用于复制字符串。它的函数原型定义在 <string.h> 头文件中。

#include <string.h>  
char *strcpy(char *dest, const char *src);
  • 参数:
    • dest:目标字符串的指针,即要复制到的字符串的起始地址。
    • src:源字符串的指针,即要复制的字符串的起始地址。
  • 返回值:函数返回 dest 的指针

3.2 功能说明

        strcpy 函数将 src 指向的字符串(包括终止的 '\0' 字符)复制到 dest 指向的数组中,包括终止的空字符。因此,dest 指向的数组必须足够大,以容纳要复制的字符串,包括终止的空字符。如果 dest 和 src 重叠,则 strcpy 的行为是未定义的

3.3 案例演示

#include <stdio.h>
#include <string.h>int main()
{char src[] = "Hello, World!";char dest[50]; // 确保有足够的空间来存放复制的字符串// 使用 strcpy 函数复制字符串strcpy(dest, src);// 输出复制的字符串printf("复制的字符串是: %s\n", dest);return 0;
}

        输出结果如下所示:

3.4 注意事项

        缓冲区溢出如果目标数组 dest 的大小不足以容纳源字符串 src(包括终止的空字符),则会发生缓冲区溢出,这可能导致未定义的行为,包括程序崩溃或安全漏洞。

        重叠内存如果 dest 和 src 指向的内存区域重叠,则 strcpy 的行为是未定义的。在这种情况下,应使用 memmove 函数,它总是安全地处理重叠内存。

        字符串终止strcpy 会复制源字符串中的终止空字符('\0'),因此目标字符串也会被正确地终止。

        返回值:虽然 strcpy 的返回值(dest 的指针)在大多数情况下不是必需的,但它可以用于链式调用或错误检查(尽管对于 strcpy 来说,错误检查通常是通过确保目标缓冲区足够大来实现的)。

        安全性:由于 strcpy 不检查目标缓冲区的大小,因此建议使用更安全的字符串复制函数,如 strncpy(尽管 strncpy 有其自己的限制和注意事项)。对于需要安全复制字符串的场景,考虑使用 strlcpy(如果可用)或手动实现一个安全的复制函数。 


4 strcmp

4.1 函数原型

        strcmp 函数是 C 语言标准库中的一个函数,用于比较两个字符串。其函数原型定义在 <string.h> 头文件中。

#include <string.h>  
int strcmp(const char *str1, const char *str2);
  • 参数:
    • const char *str1:指向第一个要比较的字符串的指针。
    • const char *str2:指向第二个要比较的字符串的指针。
  • 返回值:
    • 如果 str1 和 str2 字符串相等,则返回 0
    • 如果 str1 在字典序(基于字符的 ASCII 值)上小于 str2,则返回一个小于 0 的值
    • 如果 str1 在字典序(基于字符的 ASCII 值)上大于 str2,则返回一个大于 0 的值

4.2 功能说明

        strcmp 函数逐个字符地比较两个字符串,直到出现不同的字符或遇到字符串的终止符 '\0'。如果两个字符串在所有对应位置上的字符都相同,则认为这两个字符串相等。如果在某个位置上,str1 的字符在 ASCII 码表中小于 str2 的对应字符,则认为 str1 在字典序上小于 str2;反之亦然。

4.3 案例演示

#include <stdio.h>
#include <string.h>int main()
{char str1[] = "Hello";char str2[] = "World";char str3[] = "Hello";// 比较 str1 和 str2int result1 = strcmp(str1, str2);if (result1 < 0){printf("'%s' 在字典序上小于 '%s'\n", str1, str2);}else if (result1 > 0){printf("'%s' 在字典序上大于 '%s'\n", str1, str2);}else{printf("'%s' 和 '%s' 相等\n", str1, str2);}// 比较 str1 和 str3int result2 = strcmp(str1, str3);if (result2 == 0){printf("'%s' 和 '%s' 相等\n", str1, str3);}return 0;
}

        输出结果如下所示:

4.4 注意事项

        大小写敏感strcmp 函数是大小写敏感的,即 'A' 和 'a' 被视为不同的字符

        空字符串:如果任一字符串为空(即仅包含终止符 '\0',ASCII 值是 0),则非空字符串在字典序上大于空字符串

        未定义行为:如果任一指针为 NULL,则 strcmp 的行为是未定义的。在实际使用中,应确保传入的指针是有效的。

        返回值的使用:虽然返回值可以用于判断两个字符串的相对大小,但直接比较返回值与 0、<0 或 >0 时应小心,因为具体的返回值(除了 0 之外)是未指定的,并且可能因实现而异

        安全性:strcmp 本身不涉及内存分配或修改字符串内容,因此从安全性的角度来看,它相对安全。然而,在使用 strcmp 时仍需注意确保传入的字符串指针是有效的,并且不会越界访问内存。 


5 strchr

5.1 函数原型

        strchr 函数是 C 语言标准库中的一个函数,用于在字符串中查找第一次出现的指定字符。其函数原型定义在 <string.h> 头文件中。

#include <string.h>  
char *strchr(const char *str, int c);
  • 参数:
    • const char *str:指向要搜索的字符串的指针。
    • int c要搜索的字符(以 int 形式传递,以便可以传递 EOF 等特殊值,但通常传递字符的 ASCII 值)。
  • 返回值:
    • 如果找到字符 c,则返回指向该字符在字符串中第一次出现的位置的指针
    • 如果未找到字符 c,则返回 NULL

5.2 功能说明

        strchr 函数遍历字符串 str,查找字符 c 的第一次出现。如果找到该字符,函数将返回一个指向该字符的指针;如果未找到,则返回 NULL。注意,搜索是区分大小写的

5.3 案例演示

#include <stdio.h>
#include <string.h>int main()
{char str[] = "Hello, World!";char *pos;// 查找字符 'o'pos = strchr(str, 'o');if (pos != NULL){printf("找到字符 'o',位置:%d\n", pos - str + 1); // 输出位置(基于 1 的索引)}else{printf("未找到字符 'o'。\n");}// 查找字符 'W'(注意大小写)pos = strchr(str, 'W');if (pos != NULL){printf("找到字符 'W',位置:%d\n", pos - str + 1); // 输出位置(基于 1 的索引)}else{printf("未找到字符 'W'。\n");}// 查找不存在的字符pos = strchr(str, 'x');if (pos == NULL){printf("未找到字符 'x'。\n");}return 0;
}

        输出结果如下所示:

5.4 注意事项

        大小写敏感strchr 函数在搜索时是区分大小写的

        返回值类型:尽管 strchr 的参数是 const char *,但返回类型是 char *。这允许调用者通过返回的指针修改字符串(尽管修改原始字符串指针指向的内容可能不是个好主意,因为它可能违反了原始数据的不可变性假设)。然而,如果原始字符串是字面量或位于只读内存区域,尝试修改返回的字符串可能会导致未定义行为。

        空字符串和 NULL 指针:如果 str 是空字符串(即仅包含终止的 '\0'),则 strchr 仅在未搜索到字符时返回 NULL。如果 str 是 NULL,则 strchr 的行为是未定义的,因此在调用之前应确保 str 不是 NULL

        字符参数尽管 strchr 的第二个参数是 int 类型,但通常传递的是字符的 ASCII 值或字符常量。这允许传递 EOF 或其他特殊值,但在搜索字符串字符时并不常用

        效率:strchr 函数通常实现为线性搜索,即从头开始逐个字符地检查字符串,直到找到指定的字符或到达字符串的末尾。因此,在最坏的情况下,其时间复杂度为 O(n),其中 n 是字符串的长度。


6 strrchr

6.1  函数原型

        strrchr 函数是 C 语言标准库中的一个函数,用于在字符串中查找最后一次出现的指定字符。其函数原型定义在 <string.h> 头文件中。

#include <string.h>  
char *strrchr(const char *str, int c);
  • 参数:
    • const char *str:指向要搜索的字符串的指针。
    • int c:要搜索的字符(以 int 形式传递,但通常传递的是字符的 ASCII 值)。
  • 返回值:
    • 如果找到字符 c,则返回指向该字符在字符串中最后一次出现的位置的指针。
    • 如果未找到字符 c,则返回 NULL

6.2 功能说明

        strrchr 函数遍历字符串 str,从字符串的末尾开始向前搜索,查找字符 c 的最后一次出现。如果找到该字符,函数将返回一个指向该字符的指针;如果未找到,则返回 NULL。注意,搜索是区分大小写的

6.3 案例演示

#include <stdio.h>
#include <string.h>int main()
{char str[] = "Hello, World! This is a test.";char *pos;// 查找字符 'o'pos = strrchr(str, 'o');if (pos != NULL){printf("找到字符 'o',最后一次出现的位置:%d\n", pos - str + 1); // 输出位置(基于 1 的索引)}else{printf("未找到字符 'o'。\n");}// 查找字符 't'(注意字符串中有多个't')pos = strrchr(str, 't');if (pos != NULL){printf("找到字符 't',最后一次出现的位置:%d\n", pos - str + 1); // 输出位置(基于 1 的索引)}else{printf("未找到字符 't'。\n");}// 查找不存在的字符pos = strrchr(str, 'x');if (pos == NULL){printf("未找到字符 'x'。\n");}return 0;
}

        输出结果如下所示:

6.4 注意事项

        大小写敏感strrchr 函数在搜索时是区分大小写的

        返回值类型:尽管 strrchr 的参数是 const char *,但返回类型是 char *。这允许调用者通过返回的指针修改字符串(尽管这可能不是个好主意,特别是如果原始字符串是字面量或位于只读内存区域)。

        空字符串和 NULL 指针:如果 str 是空字符串(即仅包含终止的 '\0'),则 strrchr 仅在未搜索到字符时返回 NULL。如果 str 是 NULL,则 strrchr 的行为是未定义的,因此调用前必须确保 str 不是 NULL

        字符参数:尽管 strrchr 的第二个参数是 int 类型,但通常传递的是字符的 ASCII 值或字符常量。

        效率:与 strchr 类似,strrchr 函数通常实现为从字符串末尾开始的线性搜索,其时间复杂度在最坏情况下为 O(n),其中 n 是字符串的长度。然而,由于它从末尾开始搜索,对于某些特定情况(如查找字符串末尾的特定字符),它可能比从头开始的搜索更高效。


7 strstr

7.1 函数原型

        strstr 函数是 C 语言标准库中的一个函数,用于在字符串中查找第一次出现的子串。其函数原型定义在 <string.h> 头文件中。

#include <string.h>  
char *strstr(const char *str1, const char *str2);
  • 参数:
    • const char *str1:指向要搜索的字符串(主字符串)的指针
    • const char *str2:指向要搜索的子串的指针
  • 返回值:
    • 如果找到子串 str2,则返回指向 str1 中子串 str2 第一次出现的位置的指针
    • 如果未找到子串 str2,则返回 NULL

7.2 功能说明

        strstr 函数遍历字符串 str1,查找第一次出现的与 str2 完全相同的子串。如果找到这样的子串,函数将返回一个指向 str1 中该子串起始位置的指针;如果未找到,则返回 NULL。搜索是区分大小写的

  • 如果 str2 是空字符串(即仅包含终止的 '\0'),则 strstr 将返回 str1 的起始地址,因为空字符串是任何字符串的子串
  • 如果 str1 或 str2 是 NULL,则 strstr 的行为是未定义的,因此在调用之前应确保这两个参数都不是 NULL。

7.3 案例演示

#include <stdio.h>
#include <string.h>int main()
{char str1[] = "Hello, World! This is a test.";char str2[] = "World";char *pos;// 查找子串 "World"pos = strstr(str1, str2);if (pos != NULL){printf("找到子串 '%s',位置:%d\n", str2, pos - str1 + 1); // 输出位置(基于 1 的索引)}else{printf("未找到子串 '%s'。\n", str2);}// 查找不存在的子串char str3[] = "xyz";pos = strstr(str1, str3);if (pos == NULL){printf("未找到子串 '%s'。\n", str3);}// 查找空子串(虽然不常见,但技术上可行)char str4[] = "";pos = strstr(str1, str4);if (pos != NULL){printf("找到空子串,位置:%d(即字符串开头)\n", pos - str1 + 1); // 输出位置(基于 1 的索引)}return 0;
}

        输出结果如下所示:

7.4 注意事项

        大小写敏感strstr 函数在搜索时是区分大小写的

        返回值类型:尽管 strstr 的参数是 const char *,但返回类型是 char *。这允许调用者通过返回的指针访问或修改子串(但请注意,如果原始字符串是字面量或位于只读内存区域,则不应修改它)。然而,修改返回的字符串可能会影响原始字符串的其余部分,因为它们是连续存储的。

        空字符串和 NULL 指针如果 str2 是空字符串(即仅包含终止的 '\0'),则 strstr 将返回 str1 的起始地址,因为空字符串是任何字符串的子串如果 str1 或 str2 是 NULL,则 strstr 的行为是未定义的,因此在调用之前应确保这两个参数都不是 NULL。

        效率:strstr 函数的实现通常涉及两个字符串的逐字符比较,直到找到匹配的子串或遍历完 str1。在最坏的情况下,其时间复杂度为 O(n*m),其中 n 是 str1 的长度,m 是 str2 的长度。然而,对于许多实际应用,由于 str2 通常较短,因此效率是可以接受的。

        重叠字符串:如果 str2 是 str1 的一个后缀,并且两个字符串在内存中是重叠的(尽管这种情况在标准 C 字符串操作中不常见),则 strstr 仍然能够正确找到子串。但是,在修改返回的字符串时要特别小心,以避免破坏原始字符串的其余部分。


8 strtok

8.1 函数原型

        strtok 函数是 C 语言标准库中的一个函数,用于分割字符串为一系列标记(tokens)。其函数原型定义在 <string.h> 头文件中,并需要一个额外的 <stdlib.h> 头文件来访问 NULL(在某些实现中可能不是必需的,但出于清晰和可移植性考虑,建议包含)。

#include <string.h>  
// 可能还需要 #include <stdlib.h>,尽管在函数原型中未直接使用  
char *strtok(char *str, const char *delim);
  • 参数:
    • char *str:指向要分割的字符串的指针在首次调用时,它应该是一个指向要分割的字符串的指针。在后续的调用中,它应该是 NULL,以便 strtok 继续从上次停止的地方开始分割
    • const char *delim:指向一个字符串,包含用作分隔符的字符集合
  • 返回值:返回指向下一个标记的指针。如果没有更多的标记,则返回 NULL

8.2 功能说明

        strtok 函数通过扫描 str 指向的字符串来查找由 delim 字符串中任一字符分隔的标记(token)找到的第一个标记由函数返回,并在原始字符串中用 \0 替换分隔符在后续的调用中,通过将 str 设置为 NULL,strtok 会继续从上次停止的地方扫描剩余的字符串

        strtok 函数在字符串中遇到连续的分隔符时,它会将这些连续的分隔符都视为单个分隔符,并在结果中忽略它们(即不会将连续分隔符视为多个分隔符来产生多个空标记)。

8.3 案例演示

#include <stdio.h>
#include <string.h>int main()
{char str[] = "Hello, World! This is a test.";const char delimiters[] = " ,.!";// 返回指向下一个标记的指针。如果没有更多的标记,则返回 NULLchar *token;// 获取第一个标记token = strtok(str, delimiters);while (token != NULL){printf("标记:%s\n", token);// 获取下一个标记token = strtok(NULL, delimiters);}// 注意:此时 str 已被 strtok 修改,分隔符被替换为 '\0'// 如果需要原始字符串,应保留一份副本return 0;
}

        输出结果如下所示:

        字符串初始化完成后的存储情况,如下所示:

        使用 strtok 分割字符串后,分隔符被替换为 '\0',源字符串内容如下所示:

        如果两个标记之间只有分隔符(没有非分隔符字符),那么 strtok 会在遇到第一个分隔符时停止,并返回当前的标记。然而,在紧接着的下一次调用中(仍然传递 NULL),由于所有分隔符都已被跳过,并且没有找到新的非分隔符字符来开始新的标记,strtok 将返回 NULL,表示没有更多的标记可供读取。

        例如,在上述代码中,World 和 This 之间有一个感叹号和一个空格作为分隔符,但 strtok 不会为这些分隔符都生成空标记。它只会将它们视为分隔 World 和 This 这两个标记的边界。因此,strtok 会返回 "Hello" 作为第一个标记,然后是 "World",接着是 "This",依此类推,直到字符串结束。 

8.4 注意事项

        修改原始字符串strtok 会修改传入的字符串,用 \0 替换分隔符。如果需要保留原始字符串,请在使用 strtok 之前创建一份副本。

        线程安全性:strtok 不是线程安全的,因为它使用静态变量来存储对原始字符串的引用和上次分割的位置。在多线程环境中,如果需要同时分割多个字符串,应考虑使用 strtok_r(在 POSIX 兼容系统中可用),它是 strtok 的可重入版本。

        分隔符字符串分隔符字符串中的字符可以是任何字符,包括空格、标点符号等。但是,要注意分隔符字符串中的字符是逐个检查的,而不是作为整体字符串来搜索

        连续分隔符如果字符串中有连续的分隔符,strtok 会将它们视为单个分隔符,并跳过它们,只返回一个空标记(如果请求的话)。如果两个标记之间只有分隔符,则在这些分隔符之后调用 strtok 时会立即返回 NULL,因为没有更多的标记可以读取

        空字符串如果 str 是一个空字符串,strtok 将立即返回 NULL,因为没有标记可以提取

        NULL 参数在首次调用 strtok 之后,必须通过将 str 设置为 NULL 来继续分割操作,而不是再次传递原始字符串的指针。


9 总结对比表

函数名称函数原型功能描述关键点
strlen

#include <string.h>

size_t strlen(const char *str);

计算字符串 str 的长度,不包括终止的空字符 \0。返回值类型是 size_t(%zu 打印输出),表示无符号整数。
strcat

#include <string.h>

char *strcat(char *dest, const char *src);

将 src 字符串追加到 dest 字符串的末尾,并在结果字符串的末尾添加一个空字符 \0。dest 必须有足够的空间来容纳结果字符串。如果 dest 和 src 重叠,行为未定义。
strcpy

#include <string.h>  

char *strcpy(char *dest, const char *src);

将 src 字符串复制到 dest,包括终止的空字符 \0。dest 必须有足够的空间来容纳 src 字符串。如果 dest 和 src 重叠,行为未定义。
strcmp

#include <string.h>

int strcmp(const char *str1, const char *str2);

比较两个字符串 str1 和 str2。返回值:如果 str1 和 str2 相等,返回 0;如果 str1 小于 str2,返回负数;如果 str1 大于 str2,返回正数。
strchr

#include <string.h>

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

查找字符串 str 中第一次出现的字符 c,并返回该字符的指针。如果未找到,则返回 NULL。c 是一个整数,可以是任何 ASCII 值,包括 \0。
strrchr

#include <string.h>

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

查找字符串 str 中最后一次出现的字符 c,并返回该字符的指针。如果未找到,则返回 NULL。c 是一个整数,可以是任何 ASCII 值,包括 \0。
strstr

#include <string.h>

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

查找字符串 str2 在字符串 str1 中第一次出现的位置,并返回该位置的指针。如果未找到,则返回 NULL。str2 不能是空字符串。
strtok

#include <string.h> 
char *strtok(char *str, const char *delim);

将字符串 str 按照分隔符 delim 分割成多个子字符串。每次调用返回下一个子字符串的指针,并在原始字符串中用 \0 替换分隔符

第一次调用时,str 应该是完整的字符串;后续调用时,str 应该传入 NULL。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

2021 电子设计大赛-周期信号波形识别及参数测量装置( j 题)-SZPT领跑团队-凌云

目录 一、团队介绍 二、队伍介绍 三、题目要求 四、设计摘要 五、题目分析 1.基本要求 2.发挥部分 六、总体设计框图 七、硬件电路组成 &#xff08;1&#xff09;挡位检测 &#xff08;2&#xff09;挡位选择 &#xff08;3&#xff09;电压抬升电路 &#xff08;…

商标管理软件如何实现高效商标申请与管理?

在数字化时代&#xff0c;商标管理正逐步向智能化、自动化转型。企业对于商标管理软件的需求不再仅仅局限于内部流程的优化&#xff0c;更希望这些软件能够与外部系统无缝对接&#xff0c;实现一键递交官方的高效体验。启服云商标管理软件凭借其强大的技术实力和丰富的行业经验…

Python之一些列表的练习题

1.比较和对比字符串、列表和元组。例如&#xff0c;它们可以容纳哪类内容以及在数据结构上可以做哪些操作。 1. 内容类型:- 字符串: 只能包含字符(文本)。- 列表: 可以包含任意类型的数据,如数字、字符串、其他列表等。- 元组: 可以包含任意类型的数据,与列表类似。3. 操作:(1…

RK3568教学实验箱_操作教程:5-15 直流电机控制实验

一、产品简介 TL3568-PlusTEB人工智能实验箱 国产高性能处理器 64 位 4 核低功耗 2.0 GHz超高主频 1T 超高算力 NPU 兼容鸿蒙等国产操作系统 二、实验目的 1、熟悉Qt程序的开发流程&#xff1b; 2、掌握Qt Creator的基础开发使用&#xff1b; 3、通过编写Qt程序实现直流…

操作无法完成,因为文件已在 SWVisualize2022.BoostService 中打开

在使用 Windows 卸载文件的时候&#xff0c;会出现下面的情况 类似于Linux的强制删除&#xff0c;我们需要首先停止服务&#xff0c;解决方案如下&#xff0c; 进入 cmd 命令行窗口&#xff0c;首先停止服务 net stop "SWVisualize2022.BoostService" 如果需要&am…

ANSYS Workbench三维随机多面体骨料混凝土细观

在三维混凝土细观的有限元模拟中&#xff0c;混凝土细观几何模型的建立是仿真前提&#xff0c;也是其难点。在ANSYS内高效的建立三维几何模型以匹配混凝土中多面体骨料的外形、分布、级配等参数&#xff0c;是三维混凝土细观有限元仿真模拟的关键。 随机多面体骨料3D模型的建…

香港科技大学广州|金融科技学域博士招生宣讲会——武汉大学、华中科技大学

&#x1f514;&#x1f514;&#x1f514;明日宣讲&#x1f514;&#x1f514;&#x1f514; &#x1f490;香港科技大学广州&#xff5c;金融科技学域博士招生宣讲会 &#x1f4cd;武汉大学专场 &#x1f559;时间&#xff1a;2024年9月24日&#xff08;星期二&#xff09;1…

fmql之字符驱动设备(1)

上一篇文章&#xff0c;记录了模块入口和出口函数的编写。 这一篇要继续编写字符驱动程序了。 仍然参考正点原子&#xff1a; 第3.3讲 我的第一个Linux驱动-字符设备驱动框架搭建实验_哔哩哔哩_bilibili 驱动注册和卸载 字符驱动设备的注册函数位register_chrdev 卸载函数…

让PlatformIO支持ESP32C3 SuperMini

先介绍一下这块小尺寸板子&#xff1a; ESP32C3SuperMini是一款基于 Espressif ESP32-C3 WiFi/蓝牙双模芯片的 IoT 迷你开发板。ESP32-C3 是一款32 位 RISC-V CPU&#xff0c;包含FPU&#xff08;浮点单元&#xff09;&#xff0c;可进行32 位单精度运算&#xff0c;具有强大的…

如何写出高收录词的listing文案,先做好这一点

在亚马逊上&#xff0c;关键词是连接买家搜索与产品之间的桥梁&#xff0c;超过80%的购买行为都是通过搜索关键词开始的。因此&#xff0c;文案中包含的精准关键词越多&#xff0c;Listing越能匹配买家的需求&#xff0c;从而提高自然排名并优化广告效果。 亚马逊的收录分为静…

vue.js 展示一个树形结构的数据视图,并禁用其中默认选中的节点

功能描述 展示树形结构&#xff1a; 使用 Element UI 的 <el-tree> 组件展示树形结构数据。数据由 content 数组提供&#xff0c;树形结构包含了嵌套的节点及其子节点。 默认选中节点&#xff1a; 使用 defaultCheckedKeys 属性指定默认选中的节点。这些节点在树形结构渲…

基于51单片机控制恒压供水系统设计

文章目录 前言资料获取设计介绍功能介绍设计程序具体实现截图文档目录设计获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设…

手把手教您轻松实现微信/QQ/TIM多开,消息防撤回!

文章目录 📖 介绍 📖🏡 环境 🏡📒 防回撤 📒🚀 自动补丁工具(支持多开,支持微信、QQ、TIM)🚀 最新版手动补丁📝 步骤一📝 步骤二⚓️ 相关链接 ⚓️📖 介绍 📖 在日常聊天中,微信消息被撤回的情况屡见不鲜,总让人心中充满好奇——那些被删去的内容…

【c数据结构】OJ练习篇 帮你更深层次理解链表!(相交链表、相交链表、环形链表、环形链表之寻找环形入口点、判断链表是否是回文结构、 随机链表的复制)

目录 一. 相交链表 二. 环形链表 三. 环形链表之寻找环形入口点 四. 判断链表是否是回文结构 五. 随机链表的复制 一. 相交链表 最简单粗暴的思路&#xff0c;遍历两个链表&#xff0c;分别寻找是否有相同的对应的结点。 我们对两个链表的每个对应的节点进行判断比较&…

量化交易----数据透视表----融资融券优惠代码

我们在制定和执行量化策略的过程中&#xff0c;常常需要快速检查目标因子组合的分组下portfolio的超额收益&#xff0c;我们来提供一个快速的方法&#xff0c;可以实现单因子分组&#xff0c;双因子分组和三因子分组 比如拿到一个分析师预测的数据库&#xff0c;和A股市场政策…

python:django项目知识点02——搭建简易授权码核销系统

前言 如标题所述&#xff0c;本篇博客主要围绕快速搭建业务系统展开&#xff0c;旨在&#xff1a;快速、逻辑分明。 适用对象 djangomysql&#xff0c;实现一套授权码核销功能&#xff0c;包含用户登录和授权码核销两个方面内容 业务代码 前述 基础代码已在上篇博客中讲述&…

Vue3:provide-inject实现组件通信

目录 一.作用 1.跨层级通信 2.避免重复声明 3.封装通用服务 二.性质 1.非响应式 2.不可选项 3.高级用法 三.使用 1.爷组件 2.父组件 3.子组件 四.代码 1.爷组件代码 2.父组件代码 3.子组件代码 五.效果 Vue3中的provide-inject机制是用于在组件树中进行依赖注…

01【MATLAB】最小二乘系统辨识

目录 1.系统辨识的定义及其分类 1.1 系统辨识的定义 1.2 系统辨识的分类 2.参数模型 3.系统辨识的步骤 一、最小二乘法&#xff08;Least Squares Method&#xff09;一般步骤 二、LSM原理及应用 三、LSM在控制系统建模中的应用 1.系统辨识的定义及其分类 1.1 系统辨识的…

有没有适合初学者的 OpenLayers 项目实战案例推荐?

对于初学者来说&#xff0c;OpenLayers 提供了一系列实用的项目实战案例&#xff0c;可以帮助你快速上手并掌握关键的开发技能。以下是一些推荐的入门项目案例&#xff1a; 1.基础地图显示&#xff1a; 学习如何创建一个简单的地图视图&#xff0c;并加载基础的地图图层&…

19个邮件群发小技巧,最大水平充分利用邮件营销

邮件群发在现代通信中占据着非常重要的位置。无论是在商业环境还是个人生活中&#xff0c;它都有着广泛的应用。无论您是公司的市场推广专家&#xff0c;还是社交团体的筹办者&#xff0c;掌握有效的邮件群发技巧会帮助您更好地传递信息、节约时间和提升工作效率。 确定目标受众…