2014-02-04 4 views
-1

Так что я пытаюсь получить информацию с html-страницы. Я использую curl для получения html-страницы. Затем я пытаюсь разобрать html-страницу и сохранить необходимую мне информацию в массиве символов, но я не знаю, какой размер массива должен быть. Имейте в виду, что это для назначения, поэтому я не буду давать слишком много кода, поэтому я должен динамически распределять память, но поскольку я не знаю, какой размер это, мне нужно сохранить выделение памяти с помощью realloc. Все в порядке внутри функции, но как только оно возвращается, внутри указателя ничего не хранится. Вот код. Кроме того, если есть библиотека, которая сделает это для меня, и вы знаете об этом, не могли бы вы сослаться на нее, облегчили бы мою жизнь. Спасибо!Malloc, realloc и возвращающие указатели в C

char * parse(int * input) 
{ 
    char * output = malloc(sizeof(char)); 
    int start = 270; 
    int index = start; 
    while(input[index]!='<') 
    { 
     output = realloc(output, (index-start+1)*sizeof(char)); 
     output[index-start]=input[index]; 
     index++; 
    } 
    return output; 
} 
+0

Вы должны выделить только тогда, когда, как только вы досягаемость «<» – willll

+1

Существует нет «\ 0» не добавлено в конце. – Pradheep

+0

время, чтобы изучить использование отладчика, такого как gdb, для отслеживания потока. – Pradheep

ответ

1

strchr функция находит первое вхождение второго аргумента в качестве первого аргумента.

Так вот вы должны найти способ запустить strchr начиная input[start], передавая его характер '<' в качестве второго аргумента и сохранить длину, strchr находок. Затем это даст вам длину, которую вам нужно выделить для вывода.

  • Не забудьте символ '\0' в конце.
  • Используйте библиотечную функцию для копирования строки от input до output.

Поскольку это задание, вы, вероятно, узнать, остальное сами ...

+0

Довольно часто '<' является первым символом HTML-документа. –

0

Ваш вывод должен заканчиваться «\ 0». Указатель - это просто указатель на начало строки и не имеет длины, поэтому без «\ 0» (NUL) в качестве контрольной точки вы не знаете, где находится конец.

Обычно вы не хотите вызывать realloc для каждого отдельного нового символа. Как правило, для вывода malloc() будет больше смысла быть strlen() ввода, а затем realloc() - один раз в конце.

В качестве альтернативы, вы должны удвоить его размер при каждом повторном использовании вместо простого добавления одного байта. Это требует от вас отслеживать текущую выделенную длину в отдельной переменной, так что вы знаете, когда вам нужно перераспределить.

Возможно, вы прочитали функцию strcspn, это может быть быстрее, чем использование цикла while.

1

Это динамическое чтение:

#include "stdio.h" 
#include "string.h" 
#include "stdlib.h" 

int main(){ 
int mem=270; 
char *str=malloc(mem); 
fgets(str,mem,stdin); 
while(str[strlen(str)-1]!='\n'){//checks if we ran out of space 
    mem*=2; 
    str=realloc(str,mem);//double the amount of space 
    fgets(str+mem/2-1,mem/2+1,stdin);//read the rest (hopefully) of the line into the new space. 
} 
printf("%s",str); 
} 
Смежные вопросы