Найти самое длинное/самое короткое слово в строке - 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, что означает успешное выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д