Mam pracę domową, w której muszę jakoś porównać dwie odpowiedzi HTTP. Piszę to na C i używam libcurl, aby było łatwiej. Wywołuję funkcję, która używa libcurl do wykonania żądania HTTP i odpowiedzi z innej funkcji, i chcę zwrócić odpowiedź HTTP jako char *
. Tu jest mój kodu tak daleko (zawiesi):W języku C, jak używać biblioteki libcurl do odczytywania odpowiedzi HTTP na ciąg znaków?
#include <stdio.h>
#include <curl/curl.h>
#include <string.h>
size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream) {
size_t written;
written = fwrite(ptr, size, nmemb, stream);
return written;
}
char *handle_url(void) {
CURL *curl;
char *fp;
CURLcode res;
char *url = "http://www.yahoo.com";
curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
res = curl_easy_perform(curl);
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
curl_easy_cleanup(curl);
//printf("\n%s", fp);
}
return fp;
}
Rozwiązanie C libcurl get output into a string działa, ale nie w moim przypadku, bo po prostu chcą, aby powrócić ciąg do funkcji wywołującej.
Wszelkie pomysły?
Co to jest "char * fp;"? Dlaczego zwracasz to? Jak/gdzie przydzielasz pamięć? Gdzie są moje okulary? –
lol. Miałem lata pisać C, więc wróciłem do zera. Chodzi o to, że działa on w przykładzie "C libcurl get output in a string", o którym mowa powyżej. Nie znam dokładnych danych wejściowych, więc nie jestem pewien, czy przydzielanie pamięci dla char * fp będzie działać. –
Twoja 'write_data' powinna zostać przekazana jako' char * fp' jako parametr, ale zdefiniowałeś ją jako 'FILE'. Prawdopodobnie będziesz musiał zająć się sprawą, w której twoja 'write_func' zostanie wywołana więcej niż raz. Na koniec, jeśli chcesz, aby to działało zgodnie z twoimi oczekiwaniami, 'char * fp' będzie musiało zostać przekazane do' write_func() 'jako wskaźnik do wskaźnika, abyś mógł poprawnie go przydzielić. Innymi słowy, twoje 'write_func()' powinno przyjąć 'char **', a nie 'FILE *'. – mpontillo