Поменять местами слова в строке - 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;
}

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

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

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

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


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

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

10   голосов , оценка 4 из 5
Похожие ответы