开发者社区> 问答> 正文

使用libcurl为什么无法获取到数据?

我的代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>
size_t memory_callback(void *data,size_t size,size_t nmemb,void *content){
    size_t realsize=size*nmemb;
    //char *content=(char *)user;
    content=realloc(content,realsize+1);
    if(content==NULL){
        fprintf(stderr,"not enouth memory");
        return -1;
    }
    memcpy(content,data,realsize);
    //printf("%s",content);//这里可以得到数据
    return  realsize;
}

size_t get_content(char *url,char *content){
    CURL *curl_handle;
    CURLcode res;
    curl_global_init(CURL_GLOBAL_ALL);
    curl_handle = curl_easy_init();
    curl_easy_setopt(curl_handle, CURLOPT_URL, url);
    curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2)");
    curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 0L);
    curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1L);
    curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, memory_callback);
    curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)content);
    res = curl_easy_perform(curl_handle);
    curl_easy_cleanup(curl_handle);
    curl_global_cleanup();
    return res;
}


int main(int argc,char *argv[]){
    char *content=NULL;
    get_content("http://www.baidu.com",content);
    free(content);
    printf("%s",content);//这里的content难道不是memcpy之后的吗?  
    return 0;
}

在main中无法输出数据?这是什么原因 不是传递的是指针吗? 当在函数中更改了指针 会反映到实际的变量中。

展开
收起
a123456678 2016-06-06 18:15:45 2231 0
1 条回答
写回答
取消 提交回答
  • 是指针的问题, 如果你想在函数中改变指针的值需要在传入指向指针的指针.

    帮你改了下. 有点强迫症, 顺便改了改了你的code style.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <curl/curl.h>
    
    size_t memory_callback(void *data, size_t size, size_t nmemb, void *content)
    {
        size_t realsize = size * nmemb;
        char *p = *(char **)content;
        size_t len = p ? strlen(p) : 0;
        *(char **)content = realloc(p, len + realsize + 1);
        p = *(char **)content;
    
        if (NULL == p)
        {
            fprintf(stderr,"not enouth memory");
            return -1;
        }
    
        memcpy(p + len, data, realsize);
        p[len + realsize] = '\0';
    
        return  realsize;
    }
    
    size_t get_content(char *url, char **content)
    {
        CURL *curl_handle;
        CURLcode res;
        curl_global_init(CURL_GLOBAL_ALL);
        curl_handle = curl_easy_init();
        curl_easy_setopt(curl_handle, CURLOPT_URL, url);
        curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2)");
        curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 0L);
        curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1L);
        curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, memory_callback);
        curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)content);
        res = curl_easy_perform(curl_handle);
        curl_easy_cleanup(curl_handle);
        curl_global_cleanup();
    
        return res;
    }
    
    int main(int argc, char *argv[])
    {
        char *content = NULL;
    
        get_content("http://www.baidu.com", &content);
        printf("%s\n", content);
        if (content) free(content);
    
    
        return 0;
    }
    2019-07-17 19:29:12
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载