2014-09-27 100 views
0

我在尝试与libcurl发送GET请求到服务器并保存响应。当我不使用CURLOPT_WRITEFUNCTION和CURLOPT_WRITEFDATA时,它正常工作,响应转到标准流,程序在按下按钮后关闭。Appcrash与卷曲

当我添加自己的函数和一个变量来保存响应,但是,响应结束时会出现额外的垃圾字符,并且程序在按下按钮后崩溃。

#include <iostream> 
#include <tchar.h> 
#include <stdio.h> 
#include <conio.h> 

#include "curl/curl.h" 
#include "curl/easy.h" 

#define FAIL 0 
#define PASS 1 

size_t curlWrite(void*, size_t, size_t, void*); 

CURL  *curl; 
const char *baseURL = "XXXX"; 
const char *authHeader = "Authorization: Token token=YYYY"; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    bool cURLStatus = PASS; 
    CURLcode res; 

    struct curl_slist *headers = NULL; 
    headers = curl_slist_append(headers, authHeader); 
    char *response; 

    curl = curl_easy_init(); 
    if(curl) 
    { 
     curl_easy_setopt(curl, CURLOPT_URL, baseURL); 
     curl_easy_setopt(curl, CURLOPT_HTTPGET, 1); 
     curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); 
     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curlWrite); 
     curl_easy_setopt(curl, CURLOPT_WRITEDATA, response); 
     res = curl_easy_perform(curl); 
     if(CURLE_OK != res) cURLStatus = FAIL; 
    } 
    else cURLStatus = FAIL; 

    if(cURLStatus) printf("Response: %s", response); 
    else   printf("Error: %s", curl_easy_strerror(res)); 

    curl_easy_cleanup(curl); 

    _getch(); 

    return 0; 
} 

static size_t curlWrite(void *src, size_t size, size_t nmemb, void *dst) 
{ 
    printf("Source: %s", src); 
    memcpy(dst, src, size * nmemb); 
    return size * nmemb; 
} 

这是响应我得到,接着是APPCRASH,使用上面的代码:

来源:{ “current_bac”:0 “time_until_sober”:0}

响应:{ “current_bac”:0 “time_until_sober”:0} p

如果IC omment出以下行(和一个printf):

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curlWrite); 
curl_easy_setopt(curl, CURLOPT_WRITEDATA, response); 

我得到这个:

{ “current_bac”:0, “time_until_sober”:0}

我是什么做错了?

回答

0

男人,看着周围的类似问题,我确信我必须自己编译libcurl。

其实,解决方法是使用:

char *response = (char *)malloc(sizeof(*response) * 100); 

相反的:

char *response;