使用指针选择两个字符串中的最长字符串

问题描述 投票:0回答:4

我目前正在学习考试,并且在过去的论文中遇到以下问题:

“编写一个接受两个字符串的函数。计算每个字符,并返回指向长字符串的指针。你可以扩展提供的功能以完成解决方案:“

main()
{
    return 0;
}

这是我到目前为止所拥有的,我很确定我已经接近了,但是它没有将任何内容打印到标准输出上,我也遇到了其他问题,因此如果有人可以指出正确的方向,它将对我有帮助很多!

#include <stdio.h>
#include <string.h>

int main(void)
{
    printf("The longest is %s", longest("HELLO", "HELLOO"));
    return 0;
}

int longest(char *string1, char *string2)
{
    char longer;
    if (strlen(string1)>strlen(string2)){
        longer=*string1;
    }
    else {
        longer=*string2;
    }
    return longer;
}
c function max c-strings strlen
4个回答
1
投票

你好亲近!

您的longest()函数打算返回string,但实际上它只是返回一个字符,这是所有轮子掉下来的地方。

相反,我们将longer变量从char重新定义为char *,它是指向字符串的指针。现在它将返回两个字符串中的较长者。

#include <stdio.h>
#include <string.h>

char *longest(char *, char *);

int main(void)
{
    printf("The longest is %s\n", longest("HELLO", "HELLOO"));
    return 0;
}

char * longest(char *string1, char *string2)
{
    char *longer;
    if (strlen(string1) > strlen(string2)){
        longer = string1;
    }
    else {
        longer = string2;
    }
    return longer;
}

此版本还添加了一些内务处理功能,以便在使用longest函数之前先声明它,以便编译器知道所涉及的类型。

结果是您可以简化一些功能:

char *longest(char *s1, char *s2)
{
    return strlen(s1) > strlen(s2) ? s1 : s2;
}

此版本与您的版本一样,会任意决定,如果字符串实际上是相同的长度,它将使第一个字符串获胜-尚不清楚这对您是否重要。

EDIT @Vlad指出此解决方案不能正确处理const char *指针,当然他是正确的。我故意将其忽略了,因为我没有编写通用的函数,并且认为这超出了OP的要求。

但是弗拉德是对的,所以我在这里包括他的版本:

char * longest( const char *s1, const char *s2 )
{
    return ( char * )( strlen( s1 ) < strlen( s2 ) ? s2 : s1 );
}

这是C语言中很难很好完成的部分之一:函数longest()实际上并不修改任何指向的字符串,因此它能够轻松处理这些const字符串,但是当它returns]其中之一时,它从指针中删除了const-ness,这实际上是您可以做的最好的事情:其他库函数以这种方式工作。

[如果C具有函数重载(一个版本为const,一个没有版本),或者某些特殊的独角兽键盘将参数的const大小保留为返回值,那很好,但是---没有。

这是OP可能不在意的更高级的话题,但对于更广泛的受众来说,值得注意。谢谢弗拉德。


1
投票

在作业中写有


0
投票

您需要使用最长的功能修复几个问题:


0
投票

解决方案:

© www.soinside.com 2019 - 2024. All rights reserved.