У вас есть несколько вопросов:
#include <stdio.h>
#include <time.h>
Почему этот заголовок?
#include <stdlib.h>
int main()
{
char ch, *ptrChFromFile;
int strSize;
Эта переменная должна иметь полезное начальное значение.
ptrWordsFromFile = (char*)malloc(sizeof(char));
Нет необходимости кастовать.
if(ptrChFromFile == NULL)
{
puts("COULDN'T ALLOICATE MEMORY");
exit(EXIT_FAILURE);
}
while((ch = getchar()) != EOF)
getchar
возвращает и int
, а не char
.
{
ptrChFromFile = (char*)realloc(ptrChFromFile, strSize * sizeof(char)+1);
Нам нужен еще один символ, чем раньше, и дополнительное место для 0
.
Вы должны добавить +2 (не +1) к числу элементов: (strSize+2) * sizeof(<any type>)
Обычно вы не должны напрямую присваивать результат realloc
тому же указателю. В случае неудачи вы потеряете старое значение указателя. Опять же: не требуется приведение.
if(ptrChFromFile == NULL)
{puts("failed to alloicate memory");}
Если это не удастся, вы не сможете продолжить! Выход из программы, как указано выше
*ptrChFromFile = ch;
Вы помещаете символ в начало увеличенного буфера. Вы должны добавить в конце.
strSize++;
}
Теперь у вас есть куча символов в памяти, но нет завершения для строки.
free(ptrChFromFile);
return 0;
}
После исправления это выглядит так:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int ch;
char *ptrChFromFile;
int strSize = 0;
ptrWordsFromFile = malloc(sizeof(char));
if (ptrChFromFile == NULL)
{
puts("COULDN'T ALLOICATE MEMORY");
exit(EXIT_FAILURE);
}
while ((ch = getchar()) != EOF)
{
ptrChFromFile = realloc(ptrChFromFile, (strSize+2) * sizeof(char));
if (ptrChFromFile == NULL)
{
puts("failed to allocate memory");
exit(EXIT_FAILURE);
}
ptrChFromFile[strSize] = ch;
strSize++;
}
ptrChFromFile[strSize] = 0;
// Now add detection and storing of separate words
// (You might omit storing words that are too short)
// Select random words and add together.
free(ptrChFromFile);
return 0;
}