我试图从trying .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] != '\0' && s2[i] != '\0'; i++)
sum += (s1[i] - s2[i]);
for ( ; s1[i] != '\0'; i++)
sum += (s1[i] - 0);
for ( ; s2[i] != '\0'; i++)
sum += (0 - s2[i]);
return (sum);
}我使用以下示例代码尝试了我的函数:
#include <stdio.h>
int main(void)
{
char s1[] = "Hello";
char s2[] = "World!";
printf("%d\n", string_compare(s1, s2));
printf("%d\n", string_compare(s2, s1));
printf("%d\n", string_compare(s1, s1));
return (0);
}我得到了以下输出
-53
-500
0但我应该得到:
-15
15
0为什么我会得到这样的结果??
发布于 2022-08-12 17:42:46
这种做法是不正确的。
让我们假设第一个字符串是"B",第二个字符串是"AB"。
显然,在字典顺序中,第一个字符串大于第二个字符串。
但是由于这个for循环,结果将是负的。
for ( ; s2[i] != '\0'; i++)
sum += (0 - s2[i]);虽然函数将返回一个正值。
此外,类型为sum的变量int可能会发生溢出。
此外,函数至少应该声明为
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;
} 发布于 2022-08-12 17:44:28
你太复杂了,非常简单的功能。
#define UC unsigned char
int mystrcmp(const char *s1, const char *s2)
{
int result;
while(!(result = (UC)*s1 - (UC)*s2++) && *s1++);
return result;
}发布于 2022-08-12 18:03:53
C中的字符串是以空字符(\0)结尾的字符数组。
将字符串传递给函数时,将传递指向其第一个元素的指针。指针是通过值传递的。您可以在函数中修改该指针,而不会对它所指向的字符串产生任何副作用,只要您不取消引用并将其分配给它所指向的地址。
这就是为什么0___________'s answer的指针数学有效的原因。
int mystrcmp1(const *s1,const *s2) { int结果= 0;while(!(结果=*s1-*s2++)& *s1++);返回结果;}
可以将*s1++重写为*(s1++)以消除歧义。s1++将当前指针返回到第一个字符串的开头,然后递增指针,从而指向下一个字符。然后取消对该指针的引用,以给出字符。同样的情况发生在s2指针上。
然后我们用减法来比较它们。如果它们是相同的,我们得到0,在C中,它在布尔上下文中为false。这个结果被分配给result。
现在我们可以看到,当两个字符串中的对应字符相等时,循环仍在继续,而取消引用s1不给我们空终止符。
当循环继续时,这意味着要么存在差异,要么我们到达了第一个字符串的末尾。
差异将存储在函数返回的result中。
https://stackoverflow.com/questions/73337692
复制相似问题