Длинное слово - первое
Нужно определить самое длинное слово в строке и поменять его местами с первым. Если слов с максимальной длиной несколько, менять следует первое из них.
Input Со стандартного устройства ввода вводится строка, соседние слова в которой разделены одним пробелом. Длина текста не превышает 1000 символов.
Output Нужно выдать на стандартное устройство вывода измененную строку.
Sample Input
Hi here, Man !!!
Sample Output
here, Hi Man !!!
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#define N 1000
#define M 1000
int main()
{
char arr[1000][M] = {0};
char str[N],
tmp[N],
result[N];
char sp[] = " ";
int count = 0,
max = 0;
int i = 0;
fgets(str, N - 1, stdin);
strcpy(tmp, str);
char* token = strtok(str,sp);
while (token != NULL)
{
count = strlen(token);
strcat(arr[i++], token);
if (count >= max)max = count;
token = strtok(NULL, sp);
}
for (int j = 0; j < i; j++)
{
if (strlen(arr[j]) == max)
{
char tmp_str[M];
strcpy(tmp_str, arr[0]);
strcpy(arr[0], arr[j]);
strcpy(arr[j], tmp_str);
}
}
for (int j = 0; j < i; j++)
{
printf( "%s%s", arr[j], j < i - 1 ? " " : "" );
}
return 0;
}
Как думаете, почему работает только на 90%?
Ответы (1 шт):
У вас в условии сказано, что если слов с максимальной длинной несколько, то следует менять первое из них.
А во 2 цикле вы если находите слово с максимальной длинной, то меняете его с первым словом и не выходите из цикла, а дальше ищите остальные слова с максимальной длиной.
То есть если у вас будет несколько слов с максимальной длиной, то у вас будет вместо первого слова, последнее с максимальной длиной.
Вам нужно выходить из цикла, как только вы поменяли местами слова, например так:
for (int j = 0; j < i; j++)
{
if (strlen(arr[j]) == max)
{
char tmp_str[M];
strcpy(tmp_str, arr[0]);
strcpy(arr[0], arr[j]);
strcpy(arr[j], tmp_str);
break;
}
}
Но лучшим решением будет во время нахождения слова с максимальной длиной, сохранить его индекс в массиве слов.
Например так:
int maxI = 0;
while (token != NULL)
{
count = strlen(token);
strcat(arr[i], token);
//Заметьте, что тут строгое сравнение т.к.
//нужно первое слово с максимальной длинной
if (count > max) {
max = count;
maxI = i;
}
i++;
token = strtok(NULL, sp);
}
И тогда не нужен цикл, а просто заменяете первое слово на слово с индексом maxI:
char tmp_str[M];
strcpy(tmp_str, arr[0]);
strcpy(arr[0], arr[maxI]);
strcpy(arr[maxI], tmp_str);
Полный код со всеми изменениями и немного комментариев код