c-从string.h库复制strcmp()函数



我正在尝试从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中的字符串是以空字符((结尾的字符数组。

将字符串传递给函数时,就是将指针传递给它的第一个元素。该指针通过值传递给。你可以在函数中修改指针,而不会对它指向的字符串产生任何副作用,只要你不取消引用并将其分配给它指向的地址。

这就是为什么指针数学0 ___________的回答有效。

int mystrcmp1(const char *s1, const char *s2) {
int result = 0;
while(!(result = *s1 - *s2++) && *s1++);
return result;     
} 

*s1++可以重写为*(s1++)以消除歧义。s1++将当前指针返回到第一个字符串的开头,,然后递增指针,使其指向下一个字符。然后,该指针被取消引用,以给我们提供该字符。s2指针也是如此。

然后我们用减法对它们进行比较。如果它们相同,我们得到0,在C中,它在布尔上下文中是false。该结果被分配给result

我们现在可以看到,当两个字符串中的相应字符相等时,循环仍在继续,而取消引用s1不会给我们空终止符。

当循环继续时,意味着要么有差异,要么我们到达了第一个字符串的末尾。

差值将存储在函数返回的result中。

最新更新