Напечатать все слова, которые встречаются в нем ровно один раз - 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;
}

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

В этом коде вычисляются уникальные слова в тексте, который вводится пользователем. Вот список действий, которые выполняются в коде:

  1. Ввод текста от пользователя.
  2. Создание хеш-таблицы для подсчета количества вхождений каждого слова.
  3. Разделение входной строки на слова с помощью функции strtok().
  4. Вставка каждого слова в хеш-таблицу с подсчетом количества его вхождений.
  5. Итерация по хеш-таблице и вывод на экран слов, которые встречаются ровно один раз.
  6. Уничтожение хеш-таблицы после обработки всего введенного текста. Вот список переменных и их значений:
  7. buf - буфер для ввода текста от пользователя.
  8. BUFSIZ - размер буфера.
  9. DELIM - разделитель, который используется при разбиении строки на слова (пробел, табуляция, перевод строки).
  10. hash - хеш-таблица для подсчета количества вхождений каждого слова.
  11. key, data - временные переменные, используемые при итерации по хеш-таблице.
  12. wrd - текущее слово, которое обрабатывается в цикле.
  13. GPOINTER_TO_INT, GINT_TO_POINTER - макросы для преобразования указателей в целые числа и обратно.
  14. g_hash_table_insert, g_hash_table_lookup, g_hash_table_iter_init, g_hash_table_iter_next, g_hash_table_destroy - функции из библиотеки GLib для работы с хеш-таблицами.

Оцени полезность:

12   голосов , оценка 4.25 из 5
Похожие ответы