Найти самое длинное/самое короткое слово в строке - C (СИ)

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

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

Здравствуйте! Помогите пожалуйста с задачей. Нужно найти самое длинное/самое короткое слово в строке и конкретно через функцию. Большое спасибо заранее!

Решение задачи: «Найти самое длинное/самое короткое слово в строке»

textual
Листинг программы
/* ANSI C 99 with Glib-2.0 */
 
#include <stdio.h>
#include <string.h>
#include <glib.h>
 
int key_cmp(gconstpointer a, gconstpointer b) {
    return GPOINTER_TO_INT(a) - GPOINTER_TO_INT(b);
}
 
gboolean get_min_key(gpointer key, gpointer value, gpointer data) {
    *(int*)data = GPOINTER_TO_INT(key);
    return TRUE;
}
 
gboolean get_max_key(gpointer key, gpointer value, gpointer data) {
    *(int*)data = GPOINTER_TO_INT(key);
    return FALSE;
}
 
gboolean remove_words(gpointer key, gpointer value, gpointer data) {
    g_hash_table_destroy((GHashTable*)value);
    return FALSE;
}
 
void dump_hash(gpointer key, gpointer value, gpointer data) {
    printf("\t%s\n", (char*)key);
}
 
#define DELIM " \t\n"
 
int main(void) {
    char buf[BUFSIZ];
    
    while ( printf("String: ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n' ) {
        char ** words = g_strsplit_set(buf, DELIM, -1);
        GTree * tree = g_tree_new(key_cmp);
        
        for ( char ** w = words; *w; ++w ) {
            if ( **w ) {
                int len = strlen(*w);
                GHashTable * hash = g_tree_lookup(tree, GINT_TO_POINTER(len));
                if ( ! hash ) {
                    hash = g_hash_table_new(g_str_hash, g_str_equal);
                    g_tree_insert(tree, GINT_TO_POINTER(len), hash);
                }
                g_hash_table_insert(hash, *w, NULL);
            }
        }
        
        int minLen, maxLen;
        g_tree_foreach(tree, get_min_key, &minLen);
        g_tree_foreach(tree, get_max_key, &maxLen);
        GHashTable * shortestWords = g_tree_lookup(tree, GINT_TO_POINTER(minLen));
        GHashTable * longestWords = g_tree_lookup(tree, GINT_TO_POINTER(maxLen));
        
        printf("Shortest words (%d symbols):\n", minLen);
        g_hash_table_foreach(shortestWords, dump_hash, NULL);
        printf("Longest words (%d symbols):\n", maxLen);
        g_hash_table_foreach(longestWords, dump_hash, NULL);
        
        g_tree_foreach(tree, remove_words, NULL);
        g_tree_destroy(tree);
        g_strfreev(words);
    }
    
    return 0;
}

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

  1. Ввод строки с помощью функции fgets().
  2. Разделение строки на слова с помощью функции g_strsplit_set().
  3. Создание GTree для хранения слов по их длине с использованием функции g_tree_new() и функции key_cmp() для сравнения слов.
  4. Вставка каждого слова в соответствующую GHashTable с использованием функции g_hash_table_insert().
  5. Обход GTree для поиска минимальной и максимальной длины слов с помощью функций get_min_key() и get_max_key().
  6. Вывод самых коротких и самых длинных слов с помощью функции dump_hash().
  7. Удаление всех слов из GTree и GHashTable с помощью функции remove_words().
  8. Уничтожение GTree и освобождение памяти, выделенной под слова, с помощью функций g_tree_destroy() и g_strfreev().
  9. Возврат значения 0, что означает успешное выполнение программы.

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


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

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

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