📜  C |字串|问题15(1)

📅  最后修改于: 2023-12-03 14:59:38.162000             🧑  作者: Mango

C语言字符串问题 - 15

在C语言中,字符串是以字符数组的形式存储的。因此,对于一个字符串,我们可以通过遍历数组中的每个元素来实现字符串的各种操作,包括长度计算、比较、查找、替换等等。

本文将介绍C语言中常见的字符串问题之一:如何在字符串中查找一个子串并返回它的位置。

问题描述

给定一个大字符串str和一个子串substr,请编写一个函数find_substring来查找子串在大字符串中第一次出现的位置,如果没有找到则返回-1。

函数原型为:

int find_substring(char *str, char *substr);
解决方案

要解决这个问题,我们需要遍历大字符串中的每个字符,依次比较它和子串中的字符是否相等。如果相等,则继续比较下一个字符;如果不相等,则从大字符串的下一个字符开始重新比较。

在比较过程中,需要记录下子串在大字符串中的起始位置,以便在最终找到子串时返回正确的位置。

具体的实现可以参考下面的代码:

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

int find_substring(char *str, char *substr) {
    int i, j, start;

    for (i = 0; str[i] != '\0'; i++) {
        start = i;

        // 依次比较str[start]和substr[j]是否相等
        for (j = 0; substr[j] != '\0'; j++, start++) {
            if (str[start] != substr[j]) {
                break;
            }
        }

        // 如果子串的所有字符都匹配成功,则返回子串在大字符串中的位置
        if (substr[j] == '\0') {
            return i;
        }
    }

    // 没有找到子串,返回-1
    return -1;
}

int main() {
    char str[] = "hello, world!";
    char substr[] = "world";
    int pos;

    pos = find_substring(str, substr);
    if (pos != -1) {
        printf("substring \"%s\" found at position %d\n", substr, pos);
    } else {
        printf("substring \"%s\" not found\n", substr);
    }

    return 0;
}

代码片段中,函数find_substring依次遍历大字符串中的每个字符,使用start记录子串在大字符串中的起始位置。在比较时,只要发现某个字符不匹配就立即终止比较,然后从大字符串的下一个字符开始重新比较。

在最终找到子串时,返回子串在大字符串中的位置;如果没有找到,则返回-1。

以上代码在运行时的输出结果为:

substring "world" found at position 7
总结

本文介绍了如何在C语言中查找子串在大字符串中的位置。具体的实现采用了一次遍历加一次循环的方式,代码简单清晰,易于理解。

需要注意的是,在比较字符串时,一定要考虑到字符串末尾的空字符\0。如果不注意这个细节,可能会导致一些比较错误,从而影响程序的正确性。