获取两个C字符串中第一个不同字符的指针

3

是否有标准的C函数可以比较两个C字符串,并返回第一个不同字符的指针,如果字符串相等则返回NULL?

#include <stdio.h>
int main()
{
    const char *p, *s1 = "foobar", *s2 = "foobaz";

    p = strdiffchr(s1, s2);
    if (!p)
        puts("the strings are equal");
    else
        printf("s1 has %c, where s2 has %c\n", *p, s2[p - s1]);

    return 0;
}

编辑:我选择了以下解决方案:

char *strdiffchr(const char *s1, const char *s2)
{
    while (*s1 && *s1 == *s2) {
        s1++;
        s2++;
    }
    return (*s1 == *s2) ? NULL : (char *)s1;
}

1
该函数不会返回指针,而是字符索引。 - Dai
1
我在C的参考文献中找不到strdiffchr - Victor
2
我猜这就是 OP 所寻找的。 - bagage
2个回答

7

我认为没有这样的函数。但是可以在一个单独的for循环中编写代码:

const char *p1, *p2, *s1 = "foobar", *s2 = "foobaz";
for (p1 = s1, p2 = s2 ; *p1 && *p1 == *p2 ; p1++, p2++)
    ; // Loop body is empty, because everything is done in the header.
const char *p = *p1 || *p2 ? p1 : NULL;

在ideone上的演示。


1
小问题:可以简化为 *p1 == *p2 - chux - Reinstate Monica
谢谢你的回答。我知道这很容易做到,但我想可能有一个标准函数可以实现这个目的。 - SteelTermite

2
也许:
int findIndexOfMismatch(const char *a, const char *b) {
    int i = 0;
    while (a[i] == b[i] && a[i])
       i++;
    return a[i] || b[i] ? i : -1;
}

如果两个字符串匹配,这将返回-1。 这将返回一个索引而不是指针; 你可以返回一个指针,例如:

    return a[i] || b[i] ? a + i : 0; // NB: pointer to a, not b, or null if equal

假设字符串以NULL结尾,为了安全起见,您还应该对两个字符串进行strlen()比较。 - Cloud
3
@Dogbert ...&& a[i]) 这样不是已经考虑了 strlen() 的问题吗? - chux - Reinstate Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接