Различные проблемы, но я думаю, что char *temp = strtok(NULL, "\n");
- главный виновник.
strtok(str, "\n");
сворачивание смежных "\n\n"
в один токен, и позже for (int i = 0; i < newLines; i++) { free((ret[i])); }
пытается освободить newLines
линий, хотя только* Выделено count
строк.
Код также может ошибочно пытаться освободить "\0"
Другие проблемы
Файл может не заканчиваться '\n'
и т. Д. newLineCounter
отключено на единицу.
Если файл содержит нулевой символ , newLineCounter()
будет слишком маленьким.
Другие тудбиты
Проверьте возвращаемое значение из fseek(), ftell(), malloc()
Избегайте тихого усечения размера.ftell()
возвращает long
, strlen()
возвращает size_t
.
Некоторые не проверены альтернативный код:
Чтение файла
char *read_file(FILE *f, size_t *sz) {
if (fseek(f, 0, SEEK_END)) return NULL;
long len = ftell(handler);
// If trouble finding the end or file too big ...
if (len == -1 || (unsigned long) len >= SIZE_MAX) return NULL;
*sz = len;
rewind(handler);
char *buffer = malloc(sizeof *buffer * (*sz + 1));
size_t read_size = fread(buffer, sizeof *buffer, *sz, f);
// Reading less than expected is not certainly wrong as the
// ftell technique is not _the_ best way to find file size,
// It may overstate.
// More robust code would use another approach.
buffer[read_size] = '\0';
*sz = read_size;
return buffer;
}
Подсчет строк
size_t newLineCounter(const char *mem, size_t sz) {
size_t count=0;
for(size_t i=0; i < sz; i++) {
count += mem[i] == '\n';
}
if (i > 0 && mem[sz-1] != '\n') count++;
return count;
}
Массив линий
char **arrayOfLines(char *str, size_t sz, size_t line_count) {
char **lines = malloc(sizeof *lines * (line_count + 1));
if (lines == NULL) return NULL;
for(size_t i=0; i < line_count; i++) {
const char *eol = memchr(str, '\n', sz);
size_t len;
if (eol == NULL) {
len = sz;
} else {
len = (size_t)(eol - str + 1);
}
lines[i] = malloc(len + 1);
if (lines[i]) {
memcpy(lines[i], str, len);
lines[i][len] = '\0';
}
str += len;
sz -= len;
}
lines[line_count] = NULL;
return lines;
}