Для начала вам необходимо правильно определить функцию. У него должен быть второй параметр, который будет указывать количество элементов в переданном массиве.
Он может выглядеть как минимум следующим образом
char * fun( char arr[][100] , size_t n )
{
char *longer = arr[0];
for ( size_t i = 1; i < n; ++i )
{
if ( std::strlen(longer) < std::strlen( arr[i] ) )
{
longer = arr[i];
}
}
return longer;
}
Вот демонстрационная программа
#include <iostream>
#include <cstring>
const size_t N = 100;
const char * fun( const char arr[][N] , size_t n )
{
const char *longer = arr[0];
for ( size_t i = 1; i < n; ++i )
{
if ( std::strlen(longer) < std::strlen( arr[i] ) )
{
longer = arr[i];
}
}
return longer;
}
int main()
{
char arr[][N] =
{
"Saturn", "Venus","Mars", "Earth", "Neptun"
};
const size_t M = sizeof( arr ) / sizeof( *arr );
const char *inscription = fun( arr , M );
std::cout << inscription << '\n';
return 0;
}
Вывод программы:
Saturn
Однако функция имеет недостаток. Например, обычно пользователь может передать в качестве второго аргумента значение 0
. Разыменование переданного указателя в качестве первого аргумента в этом случае может привести к неопределенному поведению. Более того, функция strlen
вызывается избыточное количество раз.
Вот более безопасная реализация функции.
#include <iostream>
#include <cstring>
const size_t N = 100;
const char ( * fun( const char arr[][N] , size_t n ) )[N]
{
const char ( *longer )[N] = arr;
size_t longer_len = 0;
if ( n != 0 )
{
longer_len = std::strlen( *longer );
}
for ( size_t i = 1; i < n; ++i )
{
size_t len = std::strlen( arr[i] );
if ( longer_len < len )
{
longer = arr + i;
longer_len = len;
}
}
return longer;
}
int main()
{
char arr[][N] =
{
"Saturn", "Venus","Mars", "Earth", "Neptun"
};
const size_t M = sizeof( arr ) / sizeof( *arr );
auto inscription = fun( arr , M );
std::cout << *inscription << '\n';
return 0;
}
Ее вывод:
Saturn
Если объявления, используемые в функции, выглядят сложными, поэтому вы можете упростить их, используя спецификатор auto
. Например,
auto fun( const char arr[][N] , size_t n )
{
auto longer = arr;
size_t longer_len = 0;
if ( n != 0 )
{
longer_len = std::strlen( *longer );
}
for ( size_t i = 1; i < n; ++i )
{
size_t len = std::strlen( arr[i] );
if ( longer_len < len )
{
longer = arr + i;
longer_len = len;
}
}
return longer;
}
Также, если вы хотите, чтобы функция не зависела от элементов размера двумерного массива, вы можете объявить функцию как функцию-шаблон. Вот и вы.
#include <iostream>
#include <cstring>
template <size_t N>
auto fun( const char arr[][N] , size_t n )
{
auto longer = arr;
size_t longer_len = 0;
if ( n != 0 )
{
longer_len = std::strlen( *longer );
}
for ( size_t i = 1; i < n; ++i )
{
size_t len = std::strlen( arr[i] );
if ( longer_len < len )
{
longer = arr + i;
longer_len = len;
}
}
return longer;
}
int main()
{
const size_t N = 100;
char arr[][N] =
{
"Saturn", "Venus","Mars", "Earth", "Neptun"
};
const size_t M = sizeof( arr ) / sizeof( *arr );
auto inscription = fun( arr , M );
std::cout << *inscription << '\n';
return 0;
}
Альтернативный подход к реализации такой функции - когда функция возвращает индекс целевого элемента вместо указателя на него.
Например
#include <iostream>
#include <cstring>
template <size_t N>
size_t fun( const char arr[][N] , size_t n )
{
size_t longer = 0;
size_t longer_len = 0;
if ( n != 0 )
{
longer_len = std::strlen( arr[longer] );
}
for ( size_t i = 1; i < n; ++i )
{
size_t len = std::strlen( arr[i] );
if ( longer_len < len )
{
longer = i;
longer_len = len;
}
}
return longer;
}
int main()
{
const size_t N = 100;
char arr[][N] =
{
"Saturn", "Venus","Mars", "Earth", "Neptun"
};
const size_t M = sizeof( arr ) / sizeof( *arr );
size_t inscription = fun( arr , M );
std::cout << arr[inscription] << '\n';
return 0;
}
Но поскольку программа является программой на C ++, вам не нужно писать свою собственную функцию. Вы можете использовать стандартный алгоритм std::max_element
, объявленный в заголовке <algorithm>
с соответствующим лямбда-выражением, например
#include <iostream>
#include <cstring>
#include <iterator>
#include <algorithm>
const size_t N = 100;
int main()
{
char arr[][N] =
{
"Saturn", "Venus","Mars", "Earth", "Neptun"
};
auto inscription = std::max_element( std::begin( arr ), std::end( arr ),
[]( const auto &s1, const auto &s2 )
{
return std::strlen( s1 ) < std::strlen( s2 );
} );
std::cout << *inscription << '\n';
return 0;
}
. Вывод программы такой же, как показано выше
Saturn