Поменять местами слова в строке - C (СИ)
Формулировка задачи:
В каждой строке текста поменять местами самое длинное и самое короткое слово.
Максимум находит правильно, но вот я не понимаю, как определить минимум и потом поменять максимум и минимум местами и обратно собрать исходный текст
#include <stdio.h>
#include <conio.h>
#include <string.h>
int main ()
{ const int n=100;
char s[n][n], max_str[n], min_str[n];
char *istr;
int i,j, len, count=0;
printf ("введи текст (Enter - закончить)\n");
for (i=0; i<n; i++)
{
gets (s[count]);
if (s[count][0] == '\0')
break;
count = count + 1;
}
printf ("\nИсходный текст:\n");
for (i=0; i<n; i++)
{
puts (s[i]);
if (s[i][0] == '\0')
break;
}
for (i=0; i<n; i++)
{
if (s[i][0] == '\0')
break;
istr = strtok (s[i], " ");
while (istr != NULL)
{
printf ("\n%s”,istr);
len = strlen (istr);
if (len > strlen(max_str))
{
strcpy (max_str, istr);
}
if (len<strlen(min_str))
{
strcpy (min_str, istr);
}
istr = strtok (NULL," ");
}
printf ("\n Самое длинное %d-й строки : %s", i+1, max_str);
printf ("\n Самое короткое %d-й строки : %s", i+1, min_str);
printf ("\n");
strcpy (max_str, "");
strcpy (min_str, "");
}
getch();
}Решение задачи: «Поменять местами слова в строке»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
int main(int argc, char** argv)
{
static char sstr[3][256] = {
"one1 two1 three four11 five six1 seven eight nine ten\0",
"C++ is an object oriented programming language\0",
"ansi C is a precursor of C++\0" };
for (int r = 0; r < 3; r++)
{
int min_i = -1, max_i = min_i;
int min_len = -1, max_len = min_len;
for (int i = 0; sstr[r][i] != '\0'; i++)
if ((sstr[r][i] == ' ') || (sstr[r][i + 1] == '\0'))
{
int k = i - 1;
while ((sstr[r][k] != ' ') && (k > 0)) k--;
int wlen = k > 0 && i < strlen(sstr[r]) - 1 ? \
abs(k - i) - 1 : abs(k - i);
if (wlen < min_len || min_len == -1)
{
min_len = wlen;
min_i = (k > 0) ? k + 1 : 0;
}
if (wlen > max_len || max_len == -1)
{
max_len = wlen;
max_i = (k > 0) ? k + 1 : 0;
}
}
char* temp_w1 = (char*)calloc(max_len, sizeof(char));
strncpy(temp_w1, &sstr[r][max_i], max_len);
char* temp_w2 = (char*)calloc(min_len, sizeof(char));
strncpy(temp_w2, &sstr[r][min_i], min_len);
int diff = abs(min_len - max_len);
int count = diff;
while (--count >= 0)
{
int i = max_i;
while (i < strlen(sstr[r]))
sstr[r][i++] = sstr[r][i + 1];
}
temp_w2[min_len] = '\0';
min_i = strstr(sstr[r], temp_w2) - sstr[r];
strncpy(&sstr[r][max_i], temp_w2, min_len);
count = diff;
while (--count >= 0)
{
int i = strlen(sstr[r]) - 1;
while (i >= min_i)
{
sstr[r][i + 1] = sstr[r][i];
i--;
}
}
strncpy(&sstr[r][min_i], temp_w1, max_len);
printf("%s\n", sstr[r]);
}
_getch();
return 0;
}
Объяснение кода листинга программы
В данном коде происходит перестановка слов в строке:
- В первой строке объявляется статическая строка sstr типа char, размером 3 на 256 символов, содержащая три строки текста.
- Далее, в цикле for перебираются все строки в массиве sstr.
- Внутри цикла, ищется пара слов в строке, которые находятся не на своих местах (определяется по количеству пробелов до и после слова).
- Затем, эти слова меняются местами, с помощью операций копирования и переноса символов.
- В конце программы, выводится на экран результат.