我想将这个cURL函数的结果存储在一个变量中,如何才能做到这一点呢?

#include <stdio.h>
#include <curl/curl.h>

int main(void)
{
  CURL *curl;
  CURLcode res;

  curl = curl_easy_init();
  if(curl) {
    curl_easy_setopt(curl, CURLOPT_URL, "curl.haxx.se");
    res = curl_easy_perform(curl);

    /* always cleanup */
    curl_easy_cleanup(curl);
  }
  return 0;
}

谢谢,我是这样解决的:

#include <stdio.h>
#include <stdlib.h>
#include <curl/curl.h>

function_pt(void *ptr, size_t size, size_t nmemb, void *stream){
    printf("%d", atoi(ptr));
}

int main(void)
{
  CURL *curl;
  curl = curl_easy_init();
  if(curl) {
    curl_easy_setopt(curl, CURLOPT_URL, "curl.haxx.se");
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, function_pt);
    curl_easy_perform(curl);
    curl_easy_cleanup(curl);
  }
  system("pause");
  return 0;
}

推荐答案

您可以设置一个回调函数,使用curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, myfunc);来接收传入的数据块

回调将采用用户定义的参数,您可以使用curl_easy_setopt(curl, CURLOPT_WRITEDATA, p)设置该参数

下面是将缓冲区struct string {*ptr; len}传递给回调函数并使用realloc()在每次调用时增加缓冲区的代码片段.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>

struct string {
  char *ptr;
  size_t len;
};

void init_string(struct string *s) {
  s->len = 0;
  s->ptr = malloc(s->len+1);
  if (s->ptr == NULL) {
    fprintf(stderr, "malloc() failed\n");
    exit(EXIT_FAILURE);
  }
  s->ptr[0] = '\0';
}

size_t writefunc(void *ptr, size_t size, size_t nmemb, struct string *s)
{
  size_t new_len = s->len + size*nmemb;
  s->ptr = realloc(s->ptr, new_len+1);
  if (s->ptr == NULL) {
    fprintf(stderr, "realloc() failed\n");
    exit(EXIT_FAILURE);
  }
  memcpy(s->ptr+s->len, ptr, size*nmemb);
  s->ptr[new_len] = '\0';
  s->len = new_len;

  return size*nmemb;
}

int main(void)
{
  CURL *curl;
  CURLcode res;

  curl = curl_easy_init();
  if(curl) {
    struct string s;
    init_string(&s);

    curl_easy_setopt(curl, CURLOPT_URL, "curl.haxx.se");
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s);
    res = curl_easy_perform(curl);

    printf("%s\n", s.ptr);
    free(s.ptr);

    /* always cleanup */
    curl_easy_cleanup(curl);
  }
  return 0;
}

C++相关问答推荐

MISIX标准和信号量的语义

由Go调用E.C.引起的内存快速增长

Ruby C Api处理异常

正确的TCP/IP数据包 struct

为什么我不能只在内存地址中添加一个int来寻址任何数组?

预先分配虚拟地址空间的区域

C:在编译时构建和使用字符串文字的预处理器宏?

为什么未初始化的 struct 的数组从另一个数组获取值?

在进程之间重定向输出和输入流的问题

通过k&;r语法的c声明无效

Valgrind正在使用一个Fexecve电话报告不可能发生的事情

C23标准是否向后兼容?

为什么会导致分段故障?(C语言中的一个程序,统计文件中某个单词的出现次数)

计算SIZE_MAX元素的长数组的大小

如何解释数组中的*(ptr)和*(ptr+2)?

Leet代码运行时错误:代码不会在Leet代码上编译,而是在其他编译器中编译,如netbeans和在线编译器

如何在C中计算包含递增和递减运算符的逻辑表达式?

如何在Rust中处理C的longjmp情况?

使用替代日历打印日期

是什么阻止编译器优化手写的 memcmp()?