Вставить введенное слово за самым коротким словом в строке - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Листинг программы
  1. //Ввести строку и слово. Вставить введенное слово за самым
  2. // коротким словом в строке.
  3. #include <stdio.h>
  4. #define MAX 100
  5. int t;
  6. int getline(char s[], int lim)
  7. {
  8. int i=0,f;
  9. char c;
  10. for (i=0; (i<(lim-1)) && ((c=getchar()) != EOF) && (c != '\n'); i++)
  11. s[i]=c;
  12. t=i;
  13. s[i++]='\0';
  14. return i;
  15. }
  16. void main(void)
  17. {
  18. int i=0, j=0;
  19. char s[MAX],w[MAX];
  20. char mow[MAX][MAX], c[MAX];
  21. printf("Enter word:\n");
  22. getline(w,MAX);
  23. printf("Enter string:\n");
  24. getline(s,MAX);
  25. int row = 0;
  26. int col = 0;
  27. for (i = 0; i < t; i++)
  28. {
  29. if ((s[i] >= 'a') && (s[i] <= 'z'))
  30. {
  31. mow[row][col]=s[i];
  32. col++;
  33. }
  34. else
  35. if(col)
  36. {
  37. mow[row][col] = '\0';
  38. row++;
  39. col = 0;
  40. }
  41. }
  42. int col2;
  43. int row2 = row; //кол во слов
  44. int row3; // перем для индекса мин слова
  45. int min;
  46. char shortest[MAX];
  47. row=0, col=0;
  48. while (mow[row][col] != '\0')
  49. {
  50. col2=col;
  51. col++;
  52. }
  53. min = col2;
  54. for (row=0, col=0; row <= row2; row++ )
  55. {
  56. while(mow[row][col] != '\0' )
  57. {
  58. col2 = col;
  59. col++;
  60. }
  61. if (col2 <= min)
  62. {
  63. min = col2;
  64. row3 = row; // запомнили индекс мин слова
  65. }
  66. }
  67. row=0;
  68. while (row != row3+1)
  69. {
  70. printf(" %s", mow[row]);
  71. row++;
  72. }
  73.  
  74. printf(" %s", w);
  75. for ((row = (row3+1)); (row <= row2); row++)
  76. {
  77. printf(" %s", mow[row]);
  78. }
  79. }
Вот вместо выполнения условия программа записывает введенное слово за словом, которое содержит столько же букв, сколько первое слово, т.е min у меня не изменяется (?). ошибка где то здесь
Листинг программы
  1. row=0, col=0;
  2. while (mow[row][col] != '\0')
  3. {
  4. col2=col;
  5. col++;
  6. }
  7. min = col2;
  8. for (row=0, col=0; row <= row2; row++ )
  9. {
  10. while(mow[row][col] != '\0' )
  11. {
  12. col2 = col;
  13. col++;
  14. }
  15. if (col2 <= min)
  16. {
  17. min = col2;
  18. row3 = row; // запомнили индекс мин слова
  19. }
  20. }
В программе я строку разбил на массив слов. Помогите, пожалуйста, разобраться.

Решение задачи: «Вставить введенное слово за самым коротким словом в строке»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <limits.h>
  5.  
  6. int main() {
  7.     char word[] = "wert";                              // введенное слово
  8.     char words[] = "asdss words abcddcba abcdcba zzz"; // слова
  9.     char buffer[256];                                  // результат
  10.     char *pWord = NULL, *pMinWord = NULL, *ptr = words;
  11.     int min_word = INT_MAX, word_len, after_min_word_idx;
  12.  
  13.     // ищем минимальное слово
  14.  
  15.     while (*ptr) {
  16.         // пропускаем пробелы перед словом
  17.         for (; *ptr == ' ' && *ptr != '\0'; ++ptr);
  18.         pWord = ptr;
  19.  
  20.         // считаем кол-во символов в слове
  21.         // конец слова - ' ' или '\0'
  22.         for (word_len = 0; *ptr != ' ' && *ptr; ++ptr, ++word_len);
  23.  
  24.         // сравниваем с текущим минимальным словом
  25.  
  26.         if (word_len > 0 && min_word > word_len) {
  27.             pMinWord = pWord;
  28.             min_word = word_len;
  29.         }
  30.     }
  31.  
  32.     if (pMinWord == NULL) {
  33.         puts("ERR: min_word isn't found");
  34.         return 1;
  35.     }
  36.  
  37.     // вычисляем индекс вставки
  38.  
  39.     after_min_word_idx = (pMinWord - words) + min_word;
  40.  
  41.  
  42.     // 1 копируем часть слов от начала до окончания минимального слова
  43.     // 2 добавляем пробел и '\0', чтобы можно было использовать str*() функции
  44.     // 3 добавляем введенное слово
  45.     // 4 копируем остальную часть слов, после минимального слова
  46.  
  47.     memcpy(buffer, words, after_min_word_idx);  // 1
  48.     buffer[after_min_word_idx]   = ' ';         // 2
  49.     buffer[after_min_word_idx+1] = '\0';
  50.     strcat(buffer, word);                       // 3
  51.     strcat(buffer, words + after_min_word_idx); // 4
  52.  
  53.     printf("new string is '%s'.\n", buffer);
  54. }

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

  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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы