我假设你想自己编写比较代码,而不是使用内置函数如strcmp()
——这些函数可能通过编写或生成优化的汇编代码来提高性能。如果字符串相等,则are_equal()
函数将返回1(true),否则返回0(false)。
次优解决方案
static inline int min(int a, int b) { return (a < b) ? a : b; }
int are_equal(const struct string *s1, const struct string *s2)
{
int len = min(s1->length, s2->length);
int i;
for (i = 0; i < len; i++)
{
if (s1->c[i] != s2->c[i])
return 0;
}
return(s1->c[i] == s2->c[i]);
}
inline
函数默认需要C99编译器支持;如果你被迫使用C89,可以将其替换为适当的宏。
更接近最优解决方案
int are_equal(const struct string *s1, const struct string *s2)
{
if (s1->length != s2->length)
return 0;
for (int i = 0; i < s1->length; i++)
{
if (s1->c[i] != s2->c[i])
return 0;
}
return 1;
}
两个版本的代码都假定
s1->c
和
s2->c
中的字符串以空字符结尾,并且
s1->length == strlen(s1->c)
和
s2->length == strlen(s2->c)
。
使用C99,也可以将返回类型用
_Bool
,或者使用
<stdbool.h>
、
bool
作为返回类型,用
true
和
false
作为返回值。
使用strcmp()
的替代解决方案
请注意,如果您只是使用
strcmp()
,则如果字符串相等,您将得到0,如果字符串不相等,则会得到非零值。因此,您也可以按照以下方式编写函数:如果字符串相等,则返回true,否则返回false:
int are_equal(const struct string *s1, const struct string *s2)
{
return strcmp(s1->c, s2->c) == 0;
}
s1
和s2
的声明吗? - exexzian(*s1).c[i]
,但C程序员会写s1->c[i]
。 - Jonathan Leffler(*s1).c
与s1->c
相同,但出于美观的原因,建议使用s1->c
。 - Basile Starynkevitch