У меня есть некоторые проблемы со строками в структуре, я думаю, что проблема в strcpy(), но я не могу ее решить. В моем упражнении я должен написать программу, которая печатает отдельные слова, заданные в качестве входных данных, отсортированные в порядке убывания частоты встречаемости и предшествующие каждому слову его количество вхождений. Я подумал, что scanf может сделать что-то не так, поэтому я использовал fgets() для stdin, чтобы взять мою строку из ввода, но это не решило мою проблему :(. Вот мой код (я еще не написал функцию, которая печатает слова в порядок частоты).
/*
Write a program that prints the distinct words given as input, sorted in order of frequency of
decreasing occurrence. Precede each word with its number of occurrences.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define SIZE 30
#define MAXWORD 5
typedef struct word_dictionary{
char ww[SIZE];
int occ;
} word;
int is_in_bucket(char *str, word data[]){
int j;
for(j=0;j<MAXWORD;j++){
if ( strcmp(str,data[j].ww) == 0)
return 1;
}
return 0;
}
void print_bucket(word data[]) {
int i;
for(i=0;i<MAXWORD;i++){
printf("{%d, %s} ", data[i].occ, data[i].ww);
}
printf("\n");
}
void main( int argc, char **argv) {
word bucket[MAXWORD];
char aux[SIZE];
int i;
int x;
int cond;
for(i=0;i<MAXWORD;i++) {
printf("Insert the word you want to save in the data structure: ");
scanf("%s",aux);
cond = is_in_bucket(aux,bucket);
if (cond == 1) {
bucket[i].occ = bucket[i].occ + 1;
memset(aux,0,SIZE);
} else {
strcpy(bucket[i].ww, aux);
bucket[i].occ = 1;
memset(aux,0,SIZE);
}
}
print_bucket(bucket);
// print_occurrences();
return;
}
Мой вывод терминала:
Вставьте слово, которое вы хотите сохранить в структуру данных: собака
Вставьте слово, которое вы хотите сохранить в структуру данных: кошка
Вставьте слово, которое вы хотите сохранить в структуру данных: собака
Вставьте слово, которое вы хотите сохранить в структуру данных: собака
Вставьте слово, которое вы хотите сохранить в структуру данных: мышь
{1, собака} {1, кошка} {-1768437999, } {1, В} {1, мышь}
Мой ожидаемый вывод терминала должен быть:
Вставьте слово, которое вы хотите сохранить в структуру данных: собака
Вставьте слово, которое вы хотите сохранить в структуру данных: кошка
Вставьте слово, которое вы хотите сохранить в структуру данных: собака
Вставьте слово, которое вы хотите сохранить в структуру данных: собака
Вставьте слово, которое вы хотите сохранить в структуру данных: мышь
{3, собака} {1, кошка} {1, мышь}
Массив, используемый для сбора входных данных, находится в стеке, то есть он не инициализирован. Бесполезно искать строки по списку неинициализированных "слов"... Всякое может случиться.
Для начала функция main должна иметь тип возвращаемого значения int.
int main( int argc, char **argv)
Поскольку параметры функции не используются, лучше объявить функцию как
int main( void )
Функция is_in_bucket
не учитывает количество фактически инициализированных элементов в массиве bucket
. Вам нужно передать этот номер в функцию.
Если слово уже присутствует в массиве, это не значит, что оно хранится именно в i-м элементе массива.
cond = is_in_bucket(aux,bucket);
if (cond == 1){
bucket[i].occ = bucket[i].occ + 1;
memset(aux,0,SIZE);
Вам нужно вернуть из функции is_in_bucket
индекс уже инициализированного элемента или, например, -1 в противном случае.
Также функция print_bucket
должна учитывать фактическое количество заполненных элементов массива bucket
.
Каждая пустая строка, которую вы удаляете из своего сообщения, уменьшит то, насколько вы раздражаете людей, пытающихся его прочитать. Также, пожалуйста, возьмите тур.