при запуске программы выдается ошибка
reallo c: неверный следующий размер
Похоже, что один из Ваши realloc
вызовы не выполняются, поскольку данные отслеживания распределителя были повреждены. Это одна из наиболее распространенных вещей, которые могут go ошибаться, когда вы перезаписываете границы объекта, особенно выделенного. Что вы делаете, много:
strcpy(&document[l][k][j][i],&text[z]);
Если вы хотите добиться какого-либо прогресса в изучении C, важно, чтобы вы узнали разницу между char
и строка. Строковые функции C, такие как strcmp()
и strcpy()
, применяются только к последним. Вы можете использовать их в пустых строках (содержащих только nul) или в односимвольных строках (содержащих один символ плюс nul ), среди других видов, но они не являются ни безопасными, ни полезными для отдельных char
s. Для отдельных char
вы вместо этого будете использовать стандартные операторы C, такие как ==
и =
.
. В случае строки, указанной выше, каждый вызов strcpy
будет пытаться скопировать весь хвост входной строки, включая терминатор, в одно-char
-большое пространство, на которое указывает &document[l][k][j][i]
. Это будет всегда записывать после конца выделенного пространства, часто много, что приводит к неопределенному поведению. Вместо этого вы хотите:
document[l][k][j][i] = text[z];
( заслуженная критика в отношении выбора четверного указателя, оставленного в стороне). Я вижу, что вы оставляете добавление ограничителя строки на потом, что в принципе нормально, но я также вижу, что вы не можете завершить последнее слово каждого предложения, если точка ('.'
) следует сразу за словом без пробела.
В тех же строках несколько вариантов использования strcmp()
каждый сравнивает весь хвост входной строки с одним из нескольких строковых литералов длины одна. Такие сравнения разрешены, но они не дадут желаемых результатов. Похоже, вам нужны простые тесты на равенство с символьными константами, вместо этого:
if (text[z] == ' ')
// ...
else if (text[z] == '.')
// ...
else if (text[z] == '\n')
И, конечно, даже с этими исправлениями ваш подход крайне неэффективен. Выделение памяти [re] сравнительно дорого, и вы выполняете выделение или перераспределение для каждого. Один. персонаж. в документе. По крайней мере, сканируйте вперед до конца каждого слова, чтобы выделить слово за раз, хотя это можно сделать даже лучше.
Кроме того, не пренебрегайте фактом что malloc()
и realloc()
могут потерпеть неудачу, и в этом случае они возвращают нулевой указатель. Надежный код тщательно проверяет и обрабатывает результаты ошибок своих вызовов функций, включая ошибки выделения.