首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从string.h .h库复制strcmp()函数

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

Stack Overflow用户
提问于 2022-08-12 17:14:45
回答 3查看 154关注 0票数 2

我试图从trying .h库复制strcmp()函数,下面是我的代码

代码语言:javascript
复制
/**
 * 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);
}

我使用以下示例代码尝试了我的函数:

代码语言:javascript
复制
#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);
}

我得到了以下输出

代码语言:javascript
复制
-53
-500
0

但我应该得到:

代码语言:javascript
复制
-15
15
0

为什么我会得到这样的结果??

EN

回答 3

Stack Overflow用户

发布于 2022-08-12 17:42:46

这种做法是不正确的。

让我们假设第一个字符串是"B",第二个字符串是"AB"

显然,在字典顺序中,第一个字符串大于第二个字符串。

但是由于这个for循环,结果将是负的。

代码语言:javascript
复制
    for ( ; s2[i] != '\0'; i++)
            sum += (0 - s2[i]);

虽然函数将返回一个正值。

此外,类型为sum的变量int可能会发生溢出。

此外,函数至少应该声明为

代码语言:javascript
复制
int string_compare( const char *s1, const char *s2);

因为传递的字符串不会在函数中更改。

该函数可以按以下方式定义

代码语言:javascript
复制
int string_compare( const char *s1, const char *s2 )
{
    while ( *s1 && *s1 == *s2 )
    {
        ++s1;
        ++s2;
    }

    return ( unsigned char )*s1 - ( unsigned char )*s2;
} 
票数 3
EN

Stack Overflow用户

发布于 2022-08-12 17:44:28

你太复杂了,非常简单的功能。

代码语言:javascript
复制
#define UC unsigned char

int mystrcmp(const char *s1, const char *s2)
{
    int result;
    while(!(result = (UC)*s1 - (UC)*s2++) && *s1++);
    return result;    
}
票数 3
EN

Stack Overflow用户

发布于 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中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73337692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档