gpt4 book ai didi

c - 使字符串比较函数更简短

转载 作者:行者123 更新时间:2023-12-01 18:46:52 26 4
gpt4 key购买 nike

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

// 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;
}

问题:

我希望循环更简短,例如避免for里面的if,但是我自己没有发现,谁能帮忙写一个简介具有相同功能界面的版本。

(请不要使用libc函数,我这样做是为了改进我的代码风格;)

最佳答案

您可能希望避免在指针处重复读取和写入,并选择 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;
}

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

此外,请考虑 size_t 是否不是更好的长度类型。

关于c - 使字符串比较函数更简短,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27545292/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com