对于初学者,您必须正确定义函数。它应该有第二个参数,用于指定传递数组中元素的数量。
至少可以这样看
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++ 程序,因此实际上您不需要编写自己的函数。您可以使用标头 <algorithm> 中声明的标准算法 std::max_element 和相应的 lambda 表达式,如
#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