Фактически это задание на проверку знаний стандартных C строковых функций.
Код, указанный в вопросе, не имеет смысла.
Например, внутри функции length
int length(char input[], int si, int ei){
int len = 0;
for(int i = si; i <= ei; i++){
len++;
}
return len;
}
параметр input
не используется. L oop внутри функции является избыточным. Функцию можно определить проще, например,
int length( int si, int ei )
{
return ei - si + 1;
}
Или в функции minLengthWord
оператор this if
if(len > minLength){
minLength = len;
определяет максимальную длину слова вместо минимальной длины.
Лучший способ определить функцию - определить ее таким образом, чтобы она возвращала позицию и длину минимального слова в данной строке. Имея такую информацию, вы всегда можете легко извлечь минимальное слово, если оно потребуется.
Вот демонстрационная программа.
#include <iostream>
#include <utility>
#include <cstring>
std::pair<size_t, size_t> minimum_word( const char *s, const char *delim = " \t" )
{
std::pair<size_t, size_t> min = { 0, 0 };
size_t i = 0;
while ( *( s + i ) )
{
i += std::strspn( s + i, delim );
if ( *( s + i ) )
{
size_t n = std::strcspn( s + i, delim );
if ( min.second == 0 || n < min.second )
{
min.first = i;
min.second = n;
}
i += n;
}
}
if ( min.second == 0 ) min.first = i;
return min;
}
int main()
{
const char *s = "Hello John Bradely";
auto min = minimum_word( s );
std::cout << "The minimum word is ";
std::cout.write( s + min.first, min.second ) << '\n';
return 0;
}
Результат программы:
The minimum word is John
Показанную функцию легко изменить так, чтобы она возвращала динамически созданный массив, в который будет скопировано минимальное слово.
#include <iostream>
#include <utility>
#include <cstring>
char * minimum_word( const char *s, const char *delim = " \t" )
{
std::pair<size_t, size_t> min = { 0, 0 };
size_t i = 0;
while ( *( s + i ) )
{
i += std::strspn( s + i, delim );
if ( *( s + i ) )
{
size_t n = std::strcspn( s + i, delim );
if ( min.second == 0 || n < min.second )
{
min.first = i;
min.second = n;
}
i += n;
}
}
if ( min.second == 0 ) min.first = i;
char *word = new char[min.second + 1]();
std::memcpy( word, s + min.first, min.second );
return word;
}
int main()
{
const char *s = "Hello John Bradely";
char *word = minimum_word( s );
std::cout << "The minimum word is " << word << '\n';
delete [] word;
return 0;
}
Результат программы:
The minimum word is John