Вставить введенное слово за самым коротким словом в строке - 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''.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д