Libcurl示例代码出现错误

Libcurl sample code come up with error

本文关键字:错误 代码 Libcurl      更新时间:2023-10-16

嗨,我是libcurl的新手,我想从一个网站得到一个字符串的源代码,这样我就可以使用visual c++中的简单函数从那里提取数据。

这是我正在使用的代码(取自curl站点的示例部分):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>
struct MemoryStruct {
   char *memory;
   size_t size;
};

static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
{
  size_t realsize = size * nmemb;
  struct MemoryStruct *mem = (struct MemoryStruct *)userp;
  mem->memory = realloc(mem->memory, mem->size + realsize + 1);
  if (mem->memory == NULL) {
    /* out of memory! */ 
    printf("not enough memory (realloc returned NULL)n");
    exit(EXIT_FAILURE);
  }
  memcpy(&(mem->memory[mem->size]), contents, realsize);
  mem->size += realsize;
  mem->memory[mem->size] = 0;
  return realsize;
}

int main(void)
{
  CURL *curl_handle;
  struct MemoryStruct chunk;
  chunk.memory = malloc(1);  /* will be grown as needed by the realloc above */ 
  chunk.size = 0;    /* no data at this point */ 
  curl_global_init(CURL_GLOBAL_ALL);
  /* init the curl session */ 
  curl_handle = curl_easy_init();
  /* specify URL to get */ 
  curl_easy_setopt(curl_handle, CURLOPT_URL, "http://www.example.com/");
  /* send all data to this function  */ 
  curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
  /* we pass our 'chunk' struct to the callback function */ 
  curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);
  /* some servers don't like requests that are made without a user-agent
     field, so we provide one */ 
  curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0");
  /* get it! */ 
  curl_easy_perform(curl_handle);
  /* cleanup curl stuff */ 
  curl_easy_cleanup(curl_handle);
  /*
   * Now, our chunk.memory points to a memory block that is chunk.size
   * bytes big and contains the remote file.
   *
   * Do something nice with it!
   *
   * You should be aware of the fact that at this point we might have an
   * allocated data block, and nothing has yet deallocated that data. So when
   * you're done with it, you should free() it as a nice application.
   */ 
  printf("%lu bytes retrievedn", (long)chunk.size);
  if(chunk.memory)
    free(chunk.memory);
  /* we're done with libcurl, so clean it up */ 
  curl_global_cleanup();
  return 0;
}

当我试图编译它时,我得到这些错误。

cpp(25): error C2440: '=' : cannot convert from 'void *' to 'char *'
 Conversion from 'void*' to pointer to non-'void' requires an explicit cast
cpp(46): error C2440: '=' : cannot convert from 'void *' to 'char *'
Conversion from 'void*' to pointer to non-'void' requires an explicit cast

我不知道很多关于指向或铸造,但如果有人知道如何解决这个问题,所以我可以从字面上读取整个HTML源代码在一个字符串。从这里开始,我计划扫描字符串并从中获取数据。

第一次出错,修改

mem->memory = realloc(mem->memory, mem->size + realsize + 1);

mem->memory = (char *) realloc(mem->memory, mem->size + realsize + 1);

第二个错误,更改

chunk.memory = malloc(1);  /* will be grown as needed by the realloc above */

chunk.memory = (char *) malloc(1);  /* will be grown as needed by the realloc above */

和上帝保佑你的libcurl工作,如果你不能自己修复这个错误