Поменять местами слова в строке - 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.
- Внутри цикла, ищется пара слов в строке, которые находятся не на своих местах (определяется по количеству пробелов до и после слова).
- Затем, эти слова меняются местами, с помощью операций копирования и переноса символов.
- В конце программы, выводится на экран результат.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д