Вставить введенное слово за самым коротким словом в строке - 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''.