В вашей функции readLine
вы возвращаете указатель на массив line
(Строго говоря, указатель на его первый символ, но здесь разница не имеет значения). Поскольку это автоматическая переменная (т. Е. Она «в стеке»), память возвращается, когда функция возвращается. Вы видите тарабарщину, потому что printf
поместил свои вещи в стек.
Вам необходимо вернуть динамически выделенный буфер из функции. У вас уже есть один, это lineBuffer
; все, что вам нужно сделать, это обрезать его до желаемой длины.
lineBuffer[count] = '\0';
realloc(lineBuffer, count + 1);
return lineBuffer;
}
ДОБАВЛЕНО (ответ на дополнительный вопрос в комментарии): readLine
возвращает указатель на символы, составляющие строку. Этот указатель - то, что вам нужно для работы с содержимым строки. Это также то, что вы должны передать free
, когда закончили использовать память, занятую этими персонажами. Вот как вы можете использовать функцию readLine
:
char *line = readLine(file);
printf("LOG: read a line: %s\n", line);
if (strchr(line, 'a')) { puts("The line contains an a"); }
/* etc. */
free(line);
/* After this point, the memory allocated for the line has been reclaimed.
You can't use the value of `line` again (though you can assign a new value
to the `line` variable if you want). */