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

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

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

Здравствуйте. Нужно написать программу. 1) в которую посимвольно (enter не прерывает ввод, символ прерывания ввода задаётся отдельно) вводишь некий текст. 2) Текст разбивается на слова (концом слова считается пробел + нужно отдельно для последнего слова дописать функцию так как у него нет пробела в конце). 3) Выбирается самое длинное слово и выводится на экран. Я завис на этом
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. // функция для разделения массива на слова//
  4. void split (char *a)
  5. {
  6. int i=0;
  7. int w=-1;
  8. while(a[i]){
  9. if(a[i]=' '){
  10. if(w>=0){
  11. printf(a,w,i-w);
  12. }
  13. w=-1;
  14. }
  15. i++;
  16. }
  17. //так и не понял как для последнего слова дописать//
  18. }
  19. int main (){
  20. char a[100];
  21. gets(a);
  22. //посимвольный ввод через getchar и while выдавал ошибку//
  23. puts(a);
  24. split(a);
  25. scanf(%s, a);
  26. getchar();
  27. }

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

textual
Листинг программы
  1. /* ANSI C 99 */
  2.  
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <glib.h>
  6.  
  7. /* Принимает указатели на строку и на символы-разделители,
  8.  * возвращает указатель на первое слово максимальной длины.
  9.  * После использования указатель отправить в g_free() */
  10. char * longest_word(const char * str, const char * delim) {
  11.     char ** words = g_strsplit_set(str, delim, -1);
  12.    
  13.     char * choose_longest(char ** allWords) {
  14.         char * current = *allWords;
  15.         if ( ! current )
  16.             return NULL;
  17.         char * next = choose_longest(allWords + 1);
  18.        
  19.         return ( next && strlen(next) > strlen(current)  ) ? next : current;
  20.     }
  21.    
  22.     char * longest = g_strdup(choose_longest(words));
  23.    
  24.     g_strfreev(words);
  25.     return longest;
  26. }
  27.  
  28. #define DELIM " \t\n"
  29.  
  30. int main(void) {
  31.     char buf[BUFSIZ];
  32.     GSList * strings = NULL;
  33.    
  34.     printf("Enter some strings and empty one when done...\n");
  35.     while ( printf("> ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n' )
  36.         strings = g_slist_append(strings, g_strdup(buf));
  37.  
  38.     char * longestWord = NULL;
  39.    
  40.     void test_longest(char * str, char ** longest) {
  41.         char * current = longest_word(str, DELIM);
  42.         if ( *longest == NULL )
  43.             *longest = current;
  44.         else if ( strlen(current) > strlen(*longest) ) {
  45.             g_free(*longest);
  46.             *longest = current;
  47.         }
  48.         else
  49.             g_free(current);
  50.     }
  51.    
  52.     g_slist_foreach(strings, (GFunc)test_longest, (gpointer)&longestWord);
  53.    
  54.     printf("First longest word: %s\n", longestWord);
  55.    
  56.     g_slist_foreach(strings, (GFunc)g_free, NULL);
  57.     g_slist_free(strings);
  58.     g_free(longestWord);
  59.        
  60.     return 0;
  61. }

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

Выше представлен код на языке C, который разделяет введённую пользователем строку на слова и выводит на экран самое длинное из них. Список действий, которые выполняются в этом коде:

  1. Включаются необходимые заголовочные файлы.
  2. В функции longest_word выделяется память под массив указателей на слова.
  3. В функции main создаётся пустой список для хранения введённых пользователем строк.
  4. У пользователя запрашивается ввод строк до тех пор, пока он не введёт пустую строку.
  5. Для каждой введённой строки вызывается функция test_longest, которая с помощью рекурсии находит самое длинное слово и добавляет его в список longestWord.
  6. В функции test_longest проверяется, является ли текущее слово самым длинным. Если да, то оно добавляется в список longestWord. Если нет, то оно удаляется.
  7. После того как все строки были обработаны, выводится на экран самое длинное слово.
  8. Все добавленные в список longestWord строки освобождаются с помощью функции g_free.
  9. Список longestWord и указатель на ввод строк buf освобождаются.
  10. Возвращается 0, что означает успешный конец работы программы.

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


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

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

6   голосов , оценка 4 из 5

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

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

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