Выбор самой длинной из двух строк с помощью указателей - PullRequest
0 голосов
/ 15 января 2020

В настоящее время я готовлюсь к экзамену и сталкивался со следующим вопросом в предыдущей статье:

"Напишите функцию, которая принимает две строки. Подсчитайте количество символов в каждой и верните указатель на длинную строку. Вы можете расширить предоставленную функцию для завершения решения: "

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;
}

Ответы [ 4 ]

1 голос
/ 15 января 2020

Ты так близко!

Ваша функция longest() намеревается вернуть строку , но на самом деле она возвращает один символ, и здесь все колеса падают.

Вместо этого мы переопределяем переменную 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 *, и, конечно, он прав. Я намеренно пропустил это, потому что я не писал общую полезную функцию, и считаю, что это выходит за рамки того, о чем спрашивал ОП.

Но Влад прав, поэтому я включаю его версию здесь:

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

Это одна из тех причудливых областей в C, где трудно сделать это действительно хорошо: функция longest() на самом деле не модифицирует ни одну из указанных строк, поэтому она легко справляется с этими const строк, но когда он возвращает один из них, он удаляет константу из указателя, и это действительно лучшее, что вы можете сделать: другие функции библиотеки работают таким образом.

Было бы хорошо, если бы у C была перегрузка функции (одна версия для const, другая для нет) или какая-то специальная клавиатура единорога, которая переносила const -ность параметров в возвращаемое значение, но - увы - это это не так.

Это более продвинутый топи c, чем, возможно, интересует ОП, но его стоит отметить для более широкой аудитории. Спасибо Влад.

1 голос
/ 15 января 2020

В назначении написано

... и возвращен указатель на длинную строку.

Однако ваша функция имеет тип возврата int и в пределах У функции есть назначения, которые не имеют смысла

char longer;
//…
longer=*string1;
//…
return longer;

И функция должна быть объявлена ​​перед ее использованием.

Функция может выглядеть следующим образом

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

Вот демонстрационная программа.

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

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

int main(void) 
{
    char *s1 = "HELLO";
    char *s2 = "HELLOO";

    puts( longest( s1, s2 ) );

    return 0;
}

Ее вывод

HELLOO
0 голосов
/ 15 января 2020

Решение:

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

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

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

Проблемы в вашем коде:

  1. В C вы должны объявить (необязательно реализовано, но подписи должны определите уже) функцию, прежде чем ссылаться на нее в своем коде. См. эту ссылку ;

  2. Ваш тип возврата - int, а не pointer to string, запрошенный назначением. Следовательно, переменная longer и возвращаемый тип функции longest должны иметь тип char *.

Хорошо иметь:

  • Использование const гарантирует вызывающей функции, что никакие изменения в строках не будут сделаны.
0 голосов
/ 15 января 2020

Вам нужно исправить несколько проблем с самой длинной функцией:

int longest(char *string1, char *string2)   // 1) why return int ?
{
    char longer;                            // 2) why char? it should be pointer
    if (strlen(string1)>strlen(string2)){
        longer=*string1;                    // 3) this is just one char, rather than a string
    }
    else {
        longer=*string2;
    }
    return longer;
}

Вот пример, который устраняет эти проблемы:

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