c - 使字符串比较功能更简洁

时间:2014-12-18 11:16:28

标签: c loops

我编写了一个函数来比较2个字符串,返回int作为比较结果,并将另一个int指针作为param传递以检索最大匹配长度。

// compare 2 strings

#include <stdio.h>

/**
 * compare 2 string,
 * 
 * @param sa
 *  string 1
 * @param sb
 *  string 2
 * @param len
 *  a int pointer pass from outside to store match length,
 * 
 * return
 *  0 if equlas, <0 if (a < b), >0 if (a > b),
 */
static int strCompare (char *sa, char *sb, int *len) {
    for((*len)=0; *sa==*sb; sa++,sb++, (*len)++) {
        // handle equals case, prevent ++ for \0,
        if(!*sa)
            break;
        // printf("%c,%c\n", *sa, *sb);
    }
    return *sa - *sb;
}

int main(int argc, char *argv[]) {
    if(argc < 3) {
        printf("need 2 arguments.\n");
        return 0;
    }
    int matchLen = 0;
    int result = strCompare(argv[1], argv[2], &matchLen);
    printf("compare:\n\t%s\n\t%s\nresult: %d\nmatch length: %d\n", argv[1], argv[2],
        result, matchLen);
    return 0;
}

问题:

我希望循环更简洁,例如避免 if 中的 for ,但我自己没有发现,任何人都可以帮助编写一个具有相同功能界面的简短版本

(请不要使用libc功能,我这样做是为了改善我的代码风格;)


这是我目前使用的功能结合以下答案:

static int strCompare(const char *a, const char *b, size_t *len) {
    size_t n;
    for (n = 0; a[n] && a[n] == b[n]; ++n)
        ;
    (*len) = n;
    return a[n] - b[n];
}

3 个答案:

答案 0 :(得分:3)

您可能希望避免重复读取和写入指针,并转到const - 正确性:

static int strCompare (const char *sa, const char *sb, int *len) {
    int tlen = 0;
    while(*sa && *sa == *sb)
        ++tlen, ++sa, ++sb;
    *len = tlen;
    return *sa - *sb;
}

或者更好restrict

static int strCompare (const char *sa, const char *sb, int * restrict len) {
    *len = 0;
    while(*sa && *sa == *sb)
        ++*len, ++sa, ++sb;
    return *sa - *sb;
}

BTW:在第一种情况下,使代码更有效的唯一方法是避免通过len重复写入。
在第二个中,它使用restrict,从而减​​少了别名(除了最后一次写入之外,还会删除所有内容)。

另外,考虑size_t对于长度来说是否不是更好的类型。

答案 1 :(得分:1)

在您的代码中,如果需要条件。因为你正在检查指针。如果您访问未分配的指针将导致分段错误。所以避免这个你 必须做if条件。或者你可以在for循环中做到这一点。

for((*len)=0; *sa==*sb && *sa!='\0' ; sa++,sb++, (*len)++);

因此,避免分段错误需要另一个条件进行检查。

答案 2 :(得分:1)

也许是这样的:

static int str_compare(const char *a, const char *b, size_t *len) {
    const char *p = a;

    for ( ; *p && *p == *b; ++p, ++b)
        ;

    *len = p - a;
    return *p - *b;
}

正如Duplicator提到的那样,使用 const 作为输入字符串。

此外size_t广泛用于尺寸和数量,因此可能更好。

通过跟踪长度替代:

static int str_compare(const char *a, const char *b, size_t *n) {
    for (*n = 0; a[*n] && a[*n] == b[*n]; ++*n)
        ;

    return a[*n] - b[*n];
}

n的所有间接看起来不太好,但仍然。


作为旁注;你应该在错误时返回1(或者其他的东西然后是0)(主要)。

相关问题