Считывание одной строки, не используя в качестве аргумента функции двойной указатель - C (СИ)
Формулировка задачи:
Язык C начал изучать недавно. Хочу написать функцию считывания строки без ограничения на её длину. Т.е. вообще без ограничения, не считая памяти на компьютере. Но пока забудем про ограниченную память. Придумал функцию, написал, работает, но остались нерешенные вопросы.
Фактически ставилась задача имитации функции scanf(), с единственным спецификатором "%s". Полное сходство в интерфейсе с функцией scanf("%s", ) достигнуто не было.
Почему использованы двойные указатели? Функция realloc может изменяться адреса, которые ей передаются для выделения памяти. Т.е. адрес, в который мы изначально хотим записать строку, в последствии может измениться. Но аргументы функции мы менять не можем никак. Пришлось вот так извернуться.
Но библиотечная функция scanf("%s", ) принимает на вход именно прямой адрес строки, а не адрес этого адреса! Если умеет она, значит можно реализовать и здесь. Я не придумал, как.
Собственно, вопросы:
1) Как обойтись без двойных указателей (как обходится scanf("%s", )), но сохранить return (кол-во считанных символов)?
2) И по реализации - не тормозят ли систему постоянные вызовы realloc? Может лучше выделять память блоками, условно по 1000 символов, чтобы не лезть в память перед каждым новым символом? Эффективна ли вообще такая схема работы с памятью, или здесь надо по-другому?
int readline(char **s) { int c, i=0; *s=realloc(*s, sizeof(char)); while((c=getchar())!=EOF && c!='\n') { *(*s+i++)=c; *s=realloc(*s, (i+1)*sizeof(char)); } if(c=='\n') { *(*s+i++)=c; *s=realloc(*s, (i+1)*sizeof(char)); } *(*s+i)='\0'; return i; }
По всей видимости, я написал глупость, потому что scanf, как выяснилось, никаким выделением памяти не занимается.
То есть, если реализовывать функцию так, как делаю я - без двойных указателей не обойтись?
Но второй вопрос остаётся: эффективно ли так работать с памятью, как работаю я?
Решение задачи: «Считывание одной строки, не используя в качестве аргумента функции двойной указатель»
textual
Листинг программы
for(;(p=fgm(f))!=NULL; free(p)) { //.... }
Объяснение кода листинга программы
В представленном коде выполняется цикл, который продолжается до тех пор, пока не будет получен NULL-указатель (что означает окончание строки). В каждой итерации цикла выполняется следующее:
- p - это указатель на текущий символ строки.
- f - это указатель на начало строки.
- fgm(f) - это функция, которая возвращает следующий символ в строке (или NULL, если достигнут конец строки).
- free(p) - это освобождает память, выделенную для строки (предполагается, что память была выделена с использованием malloc или calloc). Возможно, в теле цикла выполняются дополнительные действия, но они не представлены в данном коде.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д