You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 12:22:28