2014-02-18 18 views
3

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

#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的参考文献 – Victor

+2

中找不到'strdiffchr'我猜这就是OP所要找的。 – bagage

回答

6

我不认为有这样的功能。编码它可以在一个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; 

Demo on ideone.

+1

轻微:可以简化'* p1 && * p1 == * p2'。 – chux

+0

@chux你说得对,'&& * p2'是多余的。谢谢! – dasblinkenlight

+0

感谢您的回答。我知道这很容易做到,但我认为这可能是一个标准功能。 – 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 
+0

假设字符串是NULL分隔的,您还应该对strlen()进行比较以确保安全。 – DevNull

+2

@Dogbert不''&& a [i])'照顾'strlen()'问题? – chux

相关问题