Вставить введенное слово за самым коротким словом в строке - C (СИ)
Формулировка задачи:
//Ввести строку и слово. Вставить введенное слово за самым // коротким словом в строке. #include <stdio.h> #define MAX 100 int t; int getline(char s[], int lim) { int i=0,f; char c; for (i=0; (i<(lim-1)) && ((c=getchar()) != EOF) && (c != '\n'); i++) s[i]=c; t=i; s[i++]='\0'; return i; } void main(void) { int i=0, j=0; char s[MAX],w[MAX]; char mow[MAX][MAX], c[MAX]; printf("Enter word:\n"); getline(w,MAX); printf("Enter string:\n"); getline(s,MAX); int row = 0; int col = 0; for (i = 0; i < t; i++) { if ((s[i] >= 'a') && (s[i] <= 'z')) { mow[row][col]=s[i]; col++; } else if(col) { mow[row][col] = '\0'; row++; col = 0; } } int col2; int row2 = row; //кол во слов int row3; // перем для индекса мин слова int min; char shortest[MAX]; row=0, col=0; while (mow[row][col] != '\0') { col2=col; col++; } min = col2; for (row=0, col=0; row <= row2; row++ ) { while(mow[row][col] != '\0' ) { col2 = col; col++; } if (col2 <= min) { min = col2; row3 = row; // запомнили индекс мин слова } } row=0; while (row != row3+1) { printf(" %s", mow[row]); row++; } printf(" %s", w); for ((row = (row3+1)); (row <= row2); row++) { printf(" %s", mow[row]); } }
row=0, col=0; while (mow[row][col] != '\0') { col2=col; col++; } min = col2; for (row=0, col=0; row <= row2; row++ ) { while(mow[row][col] != '\0' ) { col2 = col; col++; } if (col2 <= min) { min = col2; row3 = row; // запомнили индекс мин слова } }
Решение задачи: «Вставить введенное слово за самым коротким словом в строке»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <limits.h> int main() { char word[] = "wert"; // введенное слово char words[] = "asdss words abcddcba abcdcba zzz"; // слова char buffer[256]; // результат char *pWord = NULL, *pMinWord = NULL, *ptr = words; int min_word = INT_MAX, word_len, after_min_word_idx; // ищем минимальное слово while (*ptr) { // пропускаем пробелы перед словом for (; *ptr == ' ' && *ptr != '\0'; ++ptr); pWord = ptr; // считаем кол-во символов в слове // конец слова - ' ' или '\0' for (word_len = 0; *ptr != ' ' && *ptr; ++ptr, ++word_len); // сравниваем с текущим минимальным словом if (word_len > 0 && min_word > word_len) { pMinWord = pWord; min_word = word_len; } } if (pMinWord == NULL) { puts("ERR: min_word isn't found"); return 1; } // вычисляем индекс вставки after_min_word_idx = (pMinWord - words) + min_word; // 1 копируем часть слов от начала до окончания минимального слова // 2 добавляем пробел и '\0', чтобы можно было использовать str*() функции // 3 добавляем введенное слово // 4 копируем остальную часть слов, после минимального слова memcpy(buffer, words, after_min_word_idx); // 1 buffer[after_min_word_idx] = ' '; // 2 buffer[after_min_word_idx+1] = '\0'; strcat(buffer, word); // 3 strcat(buffer, words + after_min_word_idx); // 4 printf("new string is '%s'.\n", buffer); }
Объяснение кода листинга программы
- Объявлены и инициализированы переменные:
word
содержит тестовое значениеwert
.words
содержит тестовое значениеasdss words abcddcba abcdcba zzz
.buffer
содержит тестовое значение пустой строки.pWord
иpMinWord
являются указателями на подстроку вwords
, которая является минимальной.ptr
является указателем на текущий символ вwords
.min_word
содержит максимально возможное значение дляint
.word_len
содержит количество символов в текущем слове.after_min_word_idx
содержит индекс после минимального слова вwords
.
- В цикле while происходит поиск минимального слова в
words
.- В начале цикла,
ptr
указывает на первый символ вwords
. - Если текущий символ является пробелом, он пропускается до следующего символа.
pWord
указывает на текущий символ, который является началом минимального слова.word_len
устанавливается равным количеству символов в текущем слове.- Если
word_len
больше 0 и текущее минимальное слово (min_word
) большеword_len
, тоmin_word
обновляется доword_len
, аpMinWord
указывает наpWord
.
- В начале цикла,
- Если
pMinWord
равноNULL
, выводится сообщение об ошибке и возвращается 1. after_min_word_idx
устанавливается равным индексу после минимального слова вwords
.- В цикле memcpy() копируются символы из
words
вbuffer
доafter_min_word_idx
. - В
buffer
добавляется пробел и\0
, чтобы можно было использовать функции str*(). - В
buffer
добавляется введенное слово. - В
buffer
добавляется остаток символов изwords
после минимального слова. - Выводится новая строка `'new string is 'buffer''.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д