在字符串的子集上使用strcmp

时间:2015-04-17 03:40:03

标签: c arrays string strcmp

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

说我有:

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

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

我想将a的第二个单词与整个字符串b进行比较。我知道a中第二个单词的起始索引。有没有办法直接使用strcmp执行此操作,还是需要先在a上添加更多单词?

4 个答案:

答案 0 :(得分:3)

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

如果它们被修改为以这样的方式终止:

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

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

a的第二个单词的索引就像你说的那样是已知的,然后是的,你可以使用strcmp(a + 6, b)进行比较。

答案 1 :(得分:0)

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

strcmp有两个指针,所以你直接添加索引。

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

答案 2 :(得分:0)

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

你认为世界上没有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','\0'};
char str2[] = {'h','e','l','l','o',' ','w','o','r','l','d','\0'};

同样有效。

如果他们 没有正确终止,那么str...来电并不是真正合适的。

答案 3 :(得分:0)

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

希望这会有所帮助