Я полагаю, что есть по крайней мере одна проблема с предложенным решением, и это не проверка, чтобы убедиться, что вы не запустили конец буфера памяти в getString ().Таким образом, одним из способов избежать этого в вашем коде чтения было бы добавление явного NULL в конец буфера, например,
char *buf = malloc (sizeof(char) * (size + 1));
if (!buf)
return NULL;
if (fread (buf, sizeof(char), size, fp) != size) {
free (buf);
return NULL;
}
buf[size] = `\0`;
И затем в вашей функции извлечения строки добавьте проверку NULL к завершению строкитесты, что-то вроде этого:
for (i = in; l_buf[i] != '\0' && (l_buf[i] == '\n' || l_buf[i] == '\r'); i++);
if (l_buf[i] == '\0') {
/* Never saw the start of a line before the buffer ran out */
return NULL;
}
for (j = i; l_buf[i] != '\0' && l_buf[j] != '\n' && l_buf[j] != '\r'; j++);
if (i == j) {
return NULL;
}
Существует еще одна потенциальная проблема, но, поскольку вы не сказали, работали ли вы в UNIX или Windows или заботились о переносимости, я не уверен.Предложенный код не имеет отношения к завершению строки, которое включает в себя как `\ r ', так и' \ n '.
Я бы также предложил сделать функцию входа в нее повторной, заменив глобальный индекс начальной позиции параметромвот так:
char *getString (void *buf, int *in) { ...
Затем просто обновите этот указатель в getString () примерно так:
*in = j;