在较大的字符串中查找子字符串的第一个字符的位置

时间:2016-11-11 23:50:37

标签: c string for-loop substring

所以我的问题是我需要使用for循环在更大的字符串中找到子字符串的数字位置。我不能使用诸如strstr之类的字符串函数,并且我已经尝试了大多数嵌套for循环的迭代。

基本上我需要一个遍历字符串寻找某个子字符串的循环,如果它与第一个字符匹配,则检查其余的字符是否匹配。

如果一切都匹配,它将返回子串的第一个字符的位置,如果没有找到,则返回-1。

非常感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

正如您正确描述的那样,这可以通过2个嵌套循环来完成:

#include <stdlib.h>  // for size_t

int indexof(const char *str, const char *substr) {
    for (size_t i = 0;; i++) {
        /* for every position in the string */
        for (size_t j = 0;; j++) {
            /* check of all characters fro substr match at this offset */
            if (substr[j] == '\0') {
                /* if we reach the end of substr, we have a match at offset i */
                return i;
            }
            if (str[i + j] != substr[j]) {
                /* if there is a mismatch, stop checking and skip to the next offset */
                break;
            }
        }
        if (str[i] == '\0') {
            /* no match found: return -1 */
            return -1;
        }
    }
}

注意:

  • 该函数被指定为返回int,因为它返回-1表示不匹配。然而,匹配的偏移可能不适合int的范围。如果可以访问超过2GB的数据,则返回在POSIX中定义的签名类型(例如ssize_t)将无法在32位系统上完全解决此问题。

  • 通过明确测试子字符串的第一个字符,可以使函数更快一些。

  • 对于长字符串和子字符串,Boyer Moore'sKnuth Morris Pratt's等更高级的算法可以更快地运行。