Вставить введенное слово за самым коротким словом в строке - 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]);
}
 
}
Вот вместо выполнения условия программа записывает введенное слово за словом, которое содержит столько же букв, сколько первое слово, т.е min у меня не изменяется (?). ошибка где то здесь
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);
}

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

  1. Объявлены и инициализированы переменные:
    • word содержит тестовое значение wert.
    • words содержит тестовое значение asdss words abcddcba abcdcba zzz.
    • buffer содержит тестовое значение пустой строки.
    • pWord и pMinWord являются указателями на подстроку в words, которая является минимальной.
    • ptr является указателем на текущий символ в words.
    • min_word содержит максимально возможное значение для int.
    • word_len содержит количество символов в текущем слове.
    • after_min_word_idx содержит индекс после минимального слова в words.
  2. В цикле while происходит поиск минимального слова в words.
    • В начале цикла, ptr указывает на первый символ в words.
    • Если текущий символ является пробелом, он пропускается до следующего символа.
    • pWord указывает на текущий символ, который является началом минимального слова.
    • word_len устанавливается равным количеству символов в текущем слове.
    • Если word_len больше 0 и текущее минимальное слово (min_word) больше word_len, то min_word обновляется до word_len, а pMinWord указывает на pWord.
  3. Если pMinWord равно NULL, выводится сообщение об ошибке и возвращается 1.
  4. after_min_word_idx устанавливается равным индексу после минимального слова в words.
  5. В цикле memcpy() копируются символы из words в buffer до after_min_word_idx.
  6. В buffer добавляется пробел и \0, чтобы можно было использовать функции str*().
  7. В buffer добавляется введенное слово.
  8. В buffer добавляется остаток символов из words после минимального слова.
  9. Выводится новая строка `'new string is 'buffer''.

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


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

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

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