c - 查找子字符串 s2 在 s1 中的位置的函数

标签 c string strstr

这是代码:

int position(char *s1, char *s2) {
    int i, j;
    for (i = 0; s1[i]; i++) {
        for (j = 0; s2[j] && s2[j] == s1[i + j]; j++);
        if (!s2[j]) return i;
    }
    return -1;
}

int main() {
    char word1[101], word2[101];
    int p;
    printf("Type two words: ");
    scanf("%s %s", word1, word2);
    p = position(word1, word2);
    if (p < 0) 
        printf("Word'%s' does not exists in the sentence '%s'.", word2, word1);
    else
        printf("Position of the word '%s' is %d.", word2, p);
    return 0;
}

第二个 for 循环如何工作?

如果函数检测到该单词,它是否返回 i?如果是,如何返回?

最佳答案

循环for (j = 0; s2[j] && s2[j] == s1[i + j]; j++);有一个空的 body ;也可以写成:

for (j = 0; s2[j] && s2[j] == s1[i + j]; j++) {
    /* empty */
}

for (j = 0; s2[j] && s2[j] == s1[i + j]; j++)
    continue;

它计算 s2 的初始子字符串的长度匹配偏移量 i 处的字符以及 s1 的后续内容。循环结束时,j是直到但不包括空终止符的匹配字符数。

这个初始子字符串是完整的字符串 s2 ,可以通过比较 s2[j] 来测试到空终止符'\0' ,我们在位置 i 有一场比赛,因此if (!s2[j]) return i;

请注意,此函数返回 0对于空子字符串 s2 ,除非 s1也是空的,这有些不一致。它应该返回 0在所有情况下:

int position(const char *s1, const char *s2) {
    int i, j;
    for (i = 0;; i++) {
        for (j = 0; s2[j] && s2[j] == s1[i + j]; j++)
            continue;
        if (!s2[j]) return i;
        if (!s1[i]) return -1;
    }
}

另请注意,如果 s1,则此函数可能具有未定义的行为长于INT_MAX ,这在 64 位系统上是可能的,其中 int有 32 位,指针和对象大小有 64 位。更改 int 会更安全变量和返回类型为 ptrdiff_t定义于 <stddef.h> ,尽管还不够充分。

标准函数strstr没有这些缺点,因为它被定义为返回指向匹配的指针:

char *strstr(const char *s1, const char *s2);

但请注意,在 C 中,它返回非 const指针即使传递了 const指针,可能会破坏 const正确性。

这是使用相同算法的简单实现:

#include <string.h>

char *strstr(const char *s1, const char *s2) {
    size_t i, j;
    for (i = 0;; i++) {
        for (j = 0; s2[j] && s2[j] == s1[i + j]; j++)
            continue;
        if (!s2[j]) return (char *)&s1[i];
        if (!s1[i]) return NULL;
    }
}

好的 C 库使用更复杂的算法,我鼓励您搜索和研究。

关于c - 查找子字符串 s2 在 s1 中的位置的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72062681/

相关文章:

c++ - 使用 OpenSSL 编译时的 qtum-core 构建问题

c - 使用转义字符从 Sysfs 路径读取长值

.net - String.Format 而不是 Substring

string - 如何确保我的 Excel 单元格将被视为字符串?

C 编程。将字符串 www.as.com 转换为 3www2as3com0

用 strstr 不行吗?

c++ - 标称情况优先与正 boolean 表达式

无法为全局结构中的变量设置值?

java - 检查数组时遇到问题

strstr() 中的着色匹配子字符串