Найти самое длинное/самое короткое слово в строке - 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, что означает успешное выполнение программы.