Проблема с динамическим выделением памяти

программирование C++ си

Необходимо написать программу, которая читает текст из файла и выводит сколько раз встречается то или иное слово (частотный словарь т.е.). Написал программу, но чувствую, что очень сильно намудрил с выделением памяти. Если выполнять программу по шагам, то программа работает и даже вроде правильно. Если сразу запустить на выполнение после открытия файла - выдаёт ошибку и 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

Примечание:
А каким образом выделить нужное кол-во памяти для строки, если я ещё не знаю какой она длины будет?
Ответы:
1) Определись на чем ты пишешь - c++ или c. Это сильно разные языки.
2) Выравнивание текста. Тот писец что у тебя читать невозможно.
3) Для всех слов для начала выдели массив например на 1 слово (не принципиально), как только места не хватает - выделяй в два раза больше. По сложности - оптимально.
4) Слово изначально читай в буфер размером например в 1 килобайт. Если слово больше - ругайся, посылай нафик.
Создай буфер на 1 килобайт. Читай слово туда. Потом смотри сколько строка там реально занимает, выделяй (+1 байт) и копируй туда. А в буфер новую строку.
И да, проверь как твоя прога весело упадет когда ты скормишь слово длинее 1 килобайта. В си есть функции с буковкой n, они тебя интересуют.
Если писать на С++,то проще создать ассоциативный список,где ключ-это слово,а значение счётчик.
map<string,int> yourmap;
Считываешь в буфер строку,далее из строки считываешь через пробел слова.
Далее
iter=yourmap.find(word);
if(iter!=yourmap.end) //если такое слово уже было
   iter->second++;
else
   yourmap.insert(make_pair(word,1));
Всё,теперь у тебя есть  полный список всретившихся слов и их количество.


15 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.