在字符串的子集上使用 strcmp

Using strcmp on a subset of a string

我想使用 strcmp 将一个字符串的子集与另一个字符串进行比较。

假设我有:

a[] = {'h','e','l','l','o',' ','w','o','r','l',d'};

b[] = {'w','o','r','l','d};

我想将 a 的第二个单词与整个字符串 b 进行比较。我知道 a 中第二个单词的起始索引。有没有办法直接使用 strcmp 或是否需要先完成 a 上的更多字词?

if (strcmp((a + index), b) == 0) { ... }

strcmp 取两个指针,所以你直接加索引

但是,您应该为每个字符串添加一个终止 NULL 字节。

假设这些 实际上 字符串而不是没有字符串终止符的字符数组,这很容易做到。

你说你没有世界上 w 的索引,所以这是一个问题:

strcmp (b, a+index)

或:

strcmp (b, &(a[index]))

取决于您认为哪个读起来更好(底层代码应该几乎相同)。

例如,请参阅此程序:

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

int main (void) {
    char *str1 = "world";
    char *str2 = "hello world";

    for (size_t i = 0; i < strlen (str2); i++)
        printf ("%s on match '%s' with '%s'\n",
            strcmp (str1, str2+i) ? "No " : "Yes",
            str1, str2+i);

    return 0;
}

输出:

No  on match 'world' with 'hello world'
No  on match 'world' with 'ello world'
No  on match 'world' with 'llo world'
No  on match 'world' with 'lo world'
No  on match 'world' with 'o world'
No  on match 'world' with ' world'
Yes on match 'world' with 'world'
No  on match 'world' with 'orld'
No  on match 'world' with 'rld'
No  on match 'world' with 'ld'
No  on match 'world' with 'd'

无论它们是字符串文字还是正确终止的字符数组都没有区别。将两个声明行替换为:

char str1[] = {'w','o','r','l','d','[=14=]'};
char str2[] = {'h','e','l','l','o',' ','w','o','r','l','d','[=14=]'};

同样有效。

如果它们没有正确终止,则str...调用并不是真正正确的调用。

abchar 数组,但它们不是字符串,因为它们不是空终止的。

如果它们被修改为像这样以 null 结尾:

char a[] = {'h','e','l','l','o',' ','w','o','r','l','d', '[=10=]'};

char b[] = {'w','o','r','l','d', '[=10=]'};

a的第二个单词的索引是按照你说的知道的,那么是的,你可以用strcmp(a + 6, b)来比较

if (strcmp(&a[6],b) == 0)

希望这对您有所帮助