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

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

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

Здравствуйте. Нужно написать программу. 1) в которую посимвольно (enter не прерывает ввод, символ прерывания ввода задаётся отдельно) вводишь некий текст. 2) Текст разбивается на слова (концом слова считается пробел + нужно отдельно для последнего слова дописать функцию так как у него нет пробела в конце). 3) Выбирается самое длинное слово и выводится на экран. Я завис на этом
#include <stdio.h>
#include <stdlib.h>
 
// функция для разделения массива на слова//
void split (char *a)
     {
     int i=0;
     int w=-1;
     while(a[i]){
     if(a[i]=' '){
     if(w>=0){
     printf(a,w,i-w);
     }
     w=-1;
     }
     i++;
     }
//так и не понял как для последнего слова дописать//
     }
int main (){
    char a[100];
    gets(a);
//посимвольный ввод через getchar и while выдавал ошибку//
    puts(a);
    split(a);
    scanf(%s, a);    
    getchar();
}

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

textual
Листинг программы
/* ANSI C 99 */
 
#include <stdio.h>
#include <string.h>
#include <glib.h>
 
/* Принимает указатели на строку и на символы-разделители,
 * возвращает указатель на первое слово максимальной длины.
 * После использования указатель отправить в g_free() */
char * longest_word(const char * str, const char * delim) {
    char ** words = g_strsplit_set(str, delim, -1);
    
    char * choose_longest(char ** allWords) {
        char * current = *allWords;
        if ( ! current )
            return NULL;
        char * next = choose_longest(allWords + 1);
        
        return ( next && strlen(next) > strlen(current)  ) ? next : current;
    }
    
    char * longest = g_strdup(choose_longest(words));
    
    g_strfreev(words);
    return longest;
}
 
#define DELIM " \t\n"
 
int main(void) {
    char buf[BUFSIZ];
    GSList * strings = NULL;
    
    printf("Enter some strings and empty one when done...\n");
    while ( printf("> ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n' )
        strings = g_slist_append(strings, g_strdup(buf));
 
    char * longestWord = NULL;
    
    void test_longest(char * str, char ** longest) {
        char * current = longest_word(str, DELIM);
        if ( *longest == NULL )
            *longest = current;
        else if ( strlen(current) > strlen(*longest) ) {
            g_free(*longest);
            *longest = current;
        }
        else
            g_free(current);
    }
    
    g_slist_foreach(strings, (GFunc)test_longest, (gpointer)&longestWord);
    
    printf("First longest word: %s\n", longestWord);
    
    g_slist_foreach(strings, (GFunc)g_free, NULL);
    g_slist_free(strings);
    g_free(longestWord);
        
    return 0;
}

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

Выше представлен код на языке 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
Похожие ответы