Поменять местами слова в строке - C (СИ)

Узнай цену своей работы

Формулировка задачи:

В каждой строке текста поменять местами самое длинное и самое короткое слово. Максимум находит правильно, но вот я не понимаю, как определить минимум и потом поменять максимум и минимум местами и обратно собрать исходный текст
Листинг программы
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <string.h>
  4. int main ()
  5. { const int n=100;
  6. char s[n][n], max_str[n], min_str[n];
  7. char *istr;
  8. int i,j, len, count=0;
  9. printf ("введи текст (Enter - закончить)\n");
  10. for (i=0; i<n; i++)
  11. {
  12. gets (s[count]);
  13. if (s[count][0] == '\0')
  14. break;
  15. count = count + 1;
  16. }
  17. printf ("\nИсходный текст:\n");
  18. for (i=0; i<n; i++)
  19. {
  20. puts (s[i]);
  21. if (s[i][0] == '\0')
  22. break;
  23. }
  24.  
  25. for (i=0; i<n; i++)
  26. {
  27. if (s[i][0] == '\0')
  28. break;
  29. istr = strtok (s[i], " ");
  30. while (istr != NULL)
  31. {
  32. printf ("\n%s”,istr);
  33. len = strlen (istr);
  34. if (len > strlen(max_str))
  35. {
  36. strcpy (max_str, istr);
  37. }
  38. if (len<strlen(min_str))
  39. {
  40. strcpy (min_str, istr);
  41. }
  42. istr = strtok (NULL," ");
  43. }
  44. printf ("\n Самое длинное %d строки : %s", i+1, max_str);
  45. printf ("\n Самое короткое %d строки : %s", i+1, min_str);
  46. printf ("\n");
  47. strcpy (max_str, "");
  48. strcpy (min_str, "");
  49. }
  50. getch();
  51. }

Решение задачи: «Поменять местами слова в строке»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <string.h>
  5.  
  6. int main(int argc, char** argv)
  7. {
  8.     static char sstr[3][256] = {
  9.         "one1 two1 three four11 five six1 seven eight nine ten\0",
  10.         "C++ is an object oriented programming language\0",
  11.         "ansi C is a precursor of C++\0" };
  12.  
  13.     for (int r = 0; r < 3; r++)
  14.     {
  15.         int min_i = -1, max_i = min_i;
  16.         int min_len = -1, max_len = min_len;
  17.         for (int i = 0; sstr[r][i] != '\0'; i++)
  18.             if ((sstr[r][i] == ' ') || (sstr[r][i + 1] == '\0'))
  19.             {
  20.                 int k = i - 1;
  21.                 while ((sstr[r][k] != ' ') && (k > 0)) k--;
  22.  
  23.                 int wlen = k > 0 && i < strlen(sstr[r]) - 1 ? \
  24.                     abs(k - i) - 1 : abs(k - i);
  25.  
  26.                 if (wlen < min_len || min_len == -1)
  27.                 {
  28.                     min_len = wlen;
  29.                     min_i = (k > 0) ? k + 1 : 0;
  30.                 }
  31.  
  32.                 if (wlen > max_len || max_len == -1)
  33.                 {
  34.                     max_len = wlen;
  35.                     max_i = (k > 0) ? k + 1 : 0;
  36.                 }
  37.             }
  38.  
  39.         char* temp_w1 = (char*)calloc(max_len, sizeof(char));
  40.         strncpy(temp_w1, &sstr[r][max_i], max_len);
  41.  
  42.         char* temp_w2 = (char*)calloc(min_len, sizeof(char));
  43.         strncpy(temp_w2, &sstr[r][min_i], min_len);
  44.  
  45.         int diff = abs(min_len - max_len);
  46.         int count = diff;
  47.         while (--count >= 0)
  48.         {
  49.             int i = max_i;
  50.             while (i < strlen(sstr[r]))
  51.                 sstr[r][i++] = sstr[r][i + 1];
  52.         }
  53.  
  54.         temp_w2[min_len] = '\0';
  55.         min_i = strstr(sstr[r], temp_w2) - sstr[r];
  56.  
  57.         strncpy(&sstr[r][max_i], temp_w2, min_len);
  58.  
  59.         count = diff;
  60.         while (--count >= 0)
  61.         {
  62.             int i = strlen(sstr[r]) - 1;
  63.             while (i >= min_i)
  64.             {
  65.                 sstr[r][i + 1] = sstr[r][i];
  66.                 i--;
  67.             }
  68.         }
  69.  
  70.         strncpy(&sstr[r][min_i], temp_w1, max_len);
  71.  
  72.         printf("%s\n", sstr[r]);
  73.     }
  74.  
  75.     _getch();
  76.  
  77.     return 0;
  78. }

Объяснение кода листинга программы

В данном коде происходит перестановка слов в строке:

  1. В первой строке объявляется статическая строка sstr типа char, размером 3 на 256 символов, содержащая три строки текста.
  2. Далее, в цикле for перебираются все строки в массиве sstr.
  3. Внутри цикла, ищется пара слов в строке, которые находятся не на своих местах (определяется по количеству пробелов до и после слова).
  4. Затем, эти слова меняются местами, с помощью операций копирования и переноса символов.
  5. В конце программы, выводится на экран результат.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы