Ты так близко!
Ваша функция 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, чем, возможно, интересует ОП, но его стоит отметить для более широкой аудитории. Спасибо Влад.