Найти самое длинное/самое короткое слово в строке - 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; }
Объяснение кода листинга программы
- Ввод строки с помощью функции
fgets()
. - Разделение строки на слова с помощью функции
g_strsplit_set()
. - Создание
GTree
для хранения слов по их длине с использованием функцииg_tree_new()
и функцииkey_cmp()
для сравнения слов. - Вставка каждого слова в соответствующую
GHashTable
с использованием функцииg_hash_table_insert()
. - Обход
GTree
для поиска минимальной и максимальной длины слов с помощью функцийget_min_key()
иget_max_key()
. - Вывод самых коротких и самых длинных слов с помощью функции
dump_hash()
. - Удаление всех слов из
GTree
иGHashTable
с помощью функцииremove_words()
. - Уничтожение
GTree
и освобождение памяти, выделенной под слова, с помощью функцийg_tree_destroy()
иg_strfreev()
. - Возврат значения 0, что означает успешное выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д