Напечатать все слова, которые встречаются в нем ровно один раз - C (СИ)
Формулировка задачи:
Здравствуйте. Помогите, пожалуйста, с задачей. Условие: Дано предложение, состоящее из слов, разделенных пробелами. Напечатать все слова, которые встречаются в нем ровно один раз.
Были идеи о том, чтобы каждое слово перенести в отдельную строку двумерного массива и сравнивать строки этого массива, но я не знаю, как это реализовать. Еще пробовал выносить одно слово в отдельную строку и сравнивать его с остальными, но в таком случае не получается цикл организовать. Буду благодарен за помощь.
Решение задачи: «Напечатать все слова, которые встречаются в нем ровно один раз»
textual
Листинг программы
#include <stdio.h> #include <string.h> #include <glib.h> #define DELIM " \t\n" int main(void) { char buf[BUFSIZ]; while ( printf("String: ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n' ) { GHashTable * hash = g_hash_table_new(g_str_hash, g_str_equal); gpointer key, data; GHashTableIter iter; char * wrd; for ( wrd = strtok(buf, DELIM); wrd; wrd = strtok(NULL, DELIM) ) g_hash_table_insert(hash, wrd, GINT_TO_POINTER(GPOINTER_TO_INT(g_hash_table_lookup(hash, wrd)) + 1)); g_hash_table_iter_init(&iter, hash); printf("Unique words:\n"); while ( g_hash_table_iter_next(&iter, &key, &data) ) if ( GPOINTER_TO_INT(data) == 1 ) printf("%s\n", (char*)key); g_hash_table_destroy(hash); } return 0; }
Объяснение кода листинга программы
В этом коде вычисляются уникальные слова в тексте, который вводится пользователем. Вот список действий, которые выполняются в коде:
- Ввод текста от пользователя.
- Создание хеш-таблицы для подсчета количества вхождений каждого слова.
- Разделение входной строки на слова с помощью функции strtok().
- Вставка каждого слова в хеш-таблицу с подсчетом количества его вхождений.
- Итерация по хеш-таблице и вывод на экран слов, которые встречаются ровно один раз.
- Уничтожение хеш-таблицы после обработки всего введенного текста. Вот список переменных и их значений:
- buf - буфер для ввода текста от пользователя.
- BUFSIZ - размер буфера.
- DELIM - разделитель, который используется при разбиении строки на слова (пробел, табуляция, перевод строки).
- hash - хеш-таблица для подсчета количества вхождений каждого слова.
- key, data - временные переменные, используемые при итерации по хеш-таблице.
- wrd - текущее слово, которое обрабатывается в цикле.
- GPOINTER_TO_INT, GINT_TO_POINTER - макросы для преобразования указателей в целые числа и обратно.
- g_hash_table_insert, g_hash_table_lookup, g_hash_table_iter_init, g_hash_table_iter_next, g_hash_table_destroy - функции из библиотеки GLib для работы с хеш-таблицами.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д