C语言字符串查找主要通过标准库函数实现:strstr用于查找子字符串的首次出现(返回指向匹配起始位置的指针),strchr用于查找字符的首次出现,strrchr用于查找字符的最后一次出现;如需自定义逻辑,可手动实现双指针匹配算法(如遍历主字符串并逐字符比较子串)。所有操作均需包含<string.h>头文件,注意处理空字符串和未找到的情况(返回NULL)。

在C语言中,字符串查找是常见的操作,主要通过标准库函数实现。

1. 使用strstr函数查找子字符串

strstr是C标准库中用于在字符串中查找子字符串的函数。

函数原型

char *strstr(const char *str, const char *substr);

用法说明

  • str中查找substr的首次出现
  • 如果找到,返回指向子字符串起始位置的指针
  • 如果未找到,返回NULL

示例代码

#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "Hello, World!";
    char *substr = "World";
    char *pos = strstr(str, substr);
    
    if (pos != NULL) {
        printf("子字符串 '%s' 在字符串中找到,位置: %ld\n", substr, pos - str);
        printf("从找到位置开始的字符串: %s\n", pos);
    } else {
        printf("子字符串 '%s' 未找到\n", substr);
    }
    
    return 0;
}

2. 使用strchr函数查找单个字符

strchr用于在字符串中查找指定字符的第一个匹配项。

函数原型

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

用法说明

  • str中从左到右查找字符c
  • 返回指向第一个匹配字符的指针
  • 如果未找到,返回NULL

示例代码

#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "Hello, World!";
    char c = 'o';
    char *pos = strchr(str, c);
    
    if (pos != NULL) {
        printf("字符 '%c' 在字符串中找到,位置: %ld\n", c, pos - str);
        printf("从找到位置开始的字符串: %s\n", pos);
    } else {
        printf("字符 '%c' 未找到\n", c);
    }
    
    return 0;
}

3. 使用strrchr函数查找单个字符的最后一次出现

strrchr用于在字符串中查找指定字符的最后一次匹配项。

函数原型

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

用法说明

  • str中从右到左查找字符c
  • 返回指向最后一个匹配字符的指针
  • 如果未找到,返回NULL

示例代码

#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "Hello, World!";
    char c = 'o';
    char *pos = strrchr(str, c);
    
    if (pos != NULL) {
        printf("字符 '%c' 在字符串中最后一次出现的位置: %ld\n", c, pos - str);
        printf("从找到位置开始的字符串: %s\n", pos);
    } else {
        printf("字符 '%c' 未找到\n", c);
    }
    
    return 0;
}

4. 手动实现字符串查找

如果需要自己实现字符串查找功能,可以使用双指针滑动匹配法。

手动实现strstr的示例

#include <stdio.h>

char *my_strstr(const char *str, const char *substr) {
    if (*substr == '\0') {
        return (char *)str;  // 空字符串总是匹配
    }
    
    while (*str != '\0') {
        const char *s = str;
        const char *p = substr;
        
        while (*s != '\0' && *p != '\0' && *s == *p) {
            s++;
            p++;
        }
        
        if (*p == '\0') {
            return (char *)str;  // 找到匹配
        }
        
        str++;
    }
    
    return NULL;  // 未找到匹配
}

int main() {
    char str[] = "Hello, World!";
    char *substr = "World";
    char *pos = my_strstr(str, substr);
    
    if (pos != NULL) {
        printf("子字符串 '%s' 在字符串中找到,位置: %ld\n", substr, pos - str);
    } else {
        printf("子字符串 '%s' 未找到\n", substr);
    }
    
    return 0;
}

5. 选择适合的查找方法

  • 查找子字符串(如"World"):使用strstr
  • 查找单个字符(如'o'):使用strchr(首次出现)或strrchr(最后一次出现)
  • 需要自定义查找逻辑:手动实现

注意事项

  1. 所有字符串操作函数都要求字符串以\0结束
  2. 使用strstr查找时,如果子字符串为空,会返回原字符串指针
  3. 当使用指针比较位置时,应使用pos - str计算偏移量
  4. 在使用返回的指针时,要确保它不为NULL

这些函数都定义在string.h头文件中,使用前需要包含该头文件。