Необходимо написать программу, которая читает текст из файла и выводит сколько раз встречается то или иное слово (частотный словарь т.е.). Написал программу, но чувствую, что очень сильно намудрил с выделением памяти. Если выполнять программу по шагам, то программа работает и даже вроде правильно. Если сразу запустить на выполнение после открытия файла - выдаёт ошибку и BC++ вырубается =) Прошу сведущих посмотреть мой код, покритиковать и внести свои правки. Авось я все таки познаю истину выделения динамической памяти))
Собственно я исходил из того, что нам заранее не известно сколько уникальных слов будет в файле и не известно какой максимальной длины будет слово.
Код:
#include "stdio.h"
#include "conio.h"
#include "string.h"
#include "ctype.h"
#include "stdlib.h"
struct Node
{
char *word;
int count;
Node *next;
};
typedef Node *PNode;
PNode Head;
PNode CreateNode (char *NewWord)
{
PNode NewNode = new Node;
NewNode->word=(char *)malloc(strlen(NewWord));
strcpy(NewNode->word, NewWord);
NewNode->count = 1;
NewNode->next = NULL;
// return NewNode;
NewNode->next = Head;
Head = NewNode;
};
PNode Find (PNode Head, char *NewWord)
{
PNode q = Head;
while (q && stricmp(q->word, NewWord))
q = q->next;
return q;
};
int main()
{
FILE* in;
char *symb;
PNode yl;
in = fopen("DR.txt", "rt");
if (in == NULL)
{
printf("Error");
return -1;
} ;
while (!feof(in))
{
fscanf(in,"%s",symb);
yl=Find(Head,symb);
if (yl == NULL)
{
CreateNode(symb);
}
else
{
yl->count++;;
};
}
PNode tmp = Head;
while(tmp)
{
printf("%s %d\n", tmp->word, tmp->count);
free(tmp->word);
tmp = tmp->next;
};
fclose(in);
return 0;
};
Примечание:
2человекпакет
1) C++
2) Кто ж знал, что пробелы гугл съест... Например вот ссылка на txt:
http://slil.ru/28371950
Примечание:
А каким образом выделить нужное кол-во памяти для строки, если я ещё не знаю какой она длины будет?
RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.
Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.
Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.