我正在尝试从string.h库复制strcmp((函数,这是我的代码
/**
* string_compare - this function compares two strings pointed
* by s1 and s2. Is a replica of the strcmp from the string.h library
* @s1: The first string to be compared
* @s2: The second string to be compared
*
* Return: On success, it returns:
* 0 if s1 is equal to s2
* negative value if s1 is less that s2
* positive value if s1 is greater than s2
*/
int string_compare(char *s1, char *s2)
{
int sum = 0, i;
for (i = 0; s1[i] != ' ' && s2[i] != ' '; i++)
sum += (s1[i] - s2[i]);
for ( ; s1[i] != ' '; i++)
sum += (s1[i] - 0);
for ( ; s2[i] != ' '; i++)
sum += (0 - s2[i]);
return (sum);
}
我使用以下示例代码尝试了我的功能:
#include <stdio.h>
int main(void)
{
char s1[] = "Hello";
char s2[] = "World!";
printf("%dn", string_compare(s1, s2));
printf("%dn", string_compare(s2, s1));
printf("%dn", string_compare(s1, s1));
return (0);
}
我得到以下输出,
-53
-500
0
但我应该得到:
-15
15
0
为什么我会得到这样的结果??
这种方法是不正确的。
假设第一个字符串是"B"
,第二个字符串是"AB"
。
很明显,在字典顺序中,第一个字符串大于第二个字符串。
但由于环路的原因,结果将为负
for ( ; s2[i] != ' '; i++)
sum += (0 - s2[i]);
尽管函数应返回正值。
此外,对于类型为int
的变量CCD_ 3可能发生溢出。
此外,该函数应至少像一样声明
int string_compare( const char *s1, const char *s2);
因为传递的字符串在函数内不会更改。
该功能可以通过以下方式定义
int string_compare( const char *s1, const char *s2 )
{
while ( *s1 && *s1 == *s2 )
{
++s1;
++s2;
}
return ( unsigned char )*s1 - ( unsigned char )*s2;
}
您过度简化了非常简单的函数。
#define UC unsigned char
int mystrcmp(const char *s1, const char *s2)
{
int result;
while(!(result = (UC)*s1 - (UC)*s2++) && *s1++);
return result;
}
C中的字符串是以空字符(