我编写了一个函数来比较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];
}
答案 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)(主要)。