C语言新手求教:如何在字符串中查找指定子串?
在C语言中查找字符串中的子串
对于C语言新手来说,有两种常用方法可以实现字符串中子串的查找:
一、使用标准库函数 strstr
C标准库的<string.h>头文件提供了strstr函数,这是最简便的实现方式,专门用于在一个字符串中查找另一个子串的首次出现位置。
完整代码示例
#include <stdio.h> #include <string.h> int main() { char string[] = "C is a programming language"; char word[] = "language"; // 调用strstr查找子串,返回子串起始指针,未找到则返回NULL char *result = strstr(string, word); if (result != NULL) { printf("找到子串:%s\n", result); // 通过指针减法计算子串在原字符串中的偏移位置(从0开始计数) printf("子串起始位置:第%d个字符\n", result - string); } else { printf("未找到指定子串\n"); } return 0; }
说明
- 必须引入
<string.h>头文件才能使用strstr函数; strstr的第一个参数是原字符串,第二个参数是要查找的子串;- 如果找到子串,返回值是子串在原字符串中的起始地址;如果没找到,返回
NULL; - 用
result - string可以得到子串起始位置的索引(因为指针相减的结果是两个地址之间的字符数)。
二、手动实现子串查找(适合理解底层逻辑)
如果你想搞清楚子串查找的底层原理,可以自己写一个简单的匹配函数,核心思路是用双重循环逐个字符比对:
完整代码示例
#include <stdio.h> #include <string.h> // 自定义子串查找函数,返回子串起始指针,未找到返回NULL char* my_strstr(const char* str, const char* substr) { // 特殊情况:如果子串是空字符串,直接返回原字符串起始地址 if (*substr == '\0') { return (char*)str; } // 遍历原字符串的每个字符 while (*str != '\0') { const char* s_ptr = str; const char* sub_ptr = substr; // 逐个字符匹配,直到不相等或其中一个字符串结束 while (*s_ptr != '\0' && *sub_ptr != '\0' && *s_ptr == *sub_ptr) { s_ptr++; sub_ptr++; } // 如果sub_ptr走到了子串末尾,说明完全匹配 if (*sub_ptr == '\0') { return (char*)str; } // 没匹配上,原字符串指针后移一位继续尝试 str++; } // 遍历完原字符串都没找到匹配,返回NULL return NULL; } int main() { char string[] = "C is a programming language"; char word[] = "language"; char* result = my_strstr(string, word); if (result != NULL) { printf("找到子串:%s\n", result); printf("子串起始位置:第%d个字符\n", result - string); } else { printf("未找到指定子串\n"); } return 0; }
说明
- 外层循环控制原字符串的遍历位置,内层循环负责比对当前位置开始的字符是否和子串完全匹配;
- 每次匹配失败后,原字符串指针后移一位,重新开始比对;
- 这种实现是最基础的暴力匹配算法,适合新手理解子串查找的核心逻辑。
内容的提问来源于stack exchange,提问作者EmiliSpotato
相关产品推荐
相关产品推荐

