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

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

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

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

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

textual
Листинг программы
  1. /* ANSI C 99 with Glib-2.0 */
  2.  
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <glib.h>
  6.  
  7. int key_cmp(gconstpointer a, gconstpointer b) {
  8.     return GPOINTER_TO_INT(a) - GPOINTER_TO_INT(b);
  9. }
  10.  
  11. gboolean get_min_key(gpointer key, gpointer value, gpointer data) {
  12.     *(int*)data = GPOINTER_TO_INT(key);
  13.     return TRUE;
  14. }
  15.  
  16. gboolean get_max_key(gpointer key, gpointer value, gpointer data) {
  17.     *(int*)data = GPOINTER_TO_INT(key);
  18.     return FALSE;
  19. }
  20.  
  21. gboolean remove_words(gpointer key, gpointer value, gpointer data) {
  22.     g_hash_table_destroy((GHashTable*)value);
  23.     return FALSE;
  24. }
  25.  
  26. void dump_hash(gpointer key, gpointer value, gpointer data) {
  27.     printf("\t%s\n", (char*)key);
  28. }
  29.  
  30. #define DELIM " \t\n"
  31.  
  32. int main(void) {
  33.     char buf[BUFSIZ];
  34.    
  35.     while ( printf("String: ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n' ) {
  36.         char ** words = g_strsplit_set(buf, DELIM, -1);
  37.         GTree * tree = g_tree_new(key_cmp);
  38.        
  39.         for ( char ** w = words; *w; ++w ) {
  40.             if ( **w ) {
  41.                 int len = strlen(*w);
  42.                 GHashTable * hash = g_tree_lookup(tree, GINT_TO_POINTER(len));
  43.                 if ( ! hash ) {
  44.                     hash = g_hash_table_new(g_str_hash, g_str_equal);
  45.                     g_tree_insert(tree, GINT_TO_POINTER(len), hash);
  46.                 }
  47.                 g_hash_table_insert(hash, *w, NULL);
  48.             }
  49.         }
  50.        
  51.         int minLen, maxLen;
  52.         g_tree_foreach(tree, get_min_key, &minLen);
  53.         g_tree_foreach(tree, get_max_key, &maxLen);
  54.         GHashTable * shortestWords = g_tree_lookup(tree, GINT_TO_POINTER(minLen));
  55.         GHashTable * longestWords = g_tree_lookup(tree, GINT_TO_POINTER(maxLen));
  56.        
  57.         printf("Shortest words (%d symbols):\n", minLen);
  58.         g_hash_table_foreach(shortestWords, dump_hash, NULL);
  59.         printf("Longest words (%d symbols):\n", maxLen);
  60.         g_hash_table_foreach(longestWords, dump_hash, NULL);
  61.        
  62.         g_tree_foreach(tree, remove_words, NULL);
  63.         g_tree_destroy(tree);
  64.         g_strfreev(words);
  65.     }
  66.    
  67.     return 0;
  68. }

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

  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

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

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

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