C++使用libcurl发起GET请求:URL字符串传参报错问题
解决libcurl中传递
std::string给CURLOPT_URL的报错问题 这个问题我太熟悉了!你碰到的错误核心原因很明确:libcurl的curl_easy_setopt是可变参数函数,它没法直接接收C++的std::string对象,编译器已经直白告诉你了——非平凡类型的对象不能通过可变参数函数传递,强行传的话运行时会直接崩溃。
为什么会报错?
curl_easy_setopt针对CURLOPT_URL选项要求的参数类型是const char*(C风格的字符串指针),但你传的是std::string这种C++字符串对象。可变参数函数处理非POD(Plain Old Data)类型时没有安全保障,所以编译器直接抛出了这个错误,避免你踩运行时崩溃的坑。
至于你用typeid(stockURL).name()看到的std::__1::string,其实就是Clang编译器(Xcode默认使用)下std::string的真实名称——因为Xcode用的是libc++标准库,std::__1是它的内部命名空间,这个结果是完全正常的,和你的问题本身无关。
怎么解决?
只需要把std::string转换成C风格字符串就行,用std::string自带的c_str()方法,它会返回一个指向字符串内部字符数组的const char*指针,完美匹配curl的要求。
另外你的代码里还有个小笔误:cout << url << endl;里的url应该是namesURL,不然会因为未定义变量报错。
修正后的完整代码
#include <iostream> #include <string> #include <curl/curl.h> int main(){ std::string names[5] = {"Joe", "Suzy", "Larry", "Sally", "John"}; for(int i = 0; i < 5;i++){ std::string namesURL = "http://names.com/" + names[i]; std::cout << namesURL << std::endl; CURL *curl; CURLcode res; curl = curl_easy_init(); if(curl) { // 关键修改:用c_str()把std::string转成const char* curl_easy_setopt(curl, CURLOPT_URL, namesURL.c_str()); /* Perform the request, res will get the return code */ res = curl_easy_perform(curl); /* Check for errors */ if(res != CURLE_OK) fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); /* always cleanup */ curl_easy_cleanup(curl); } } return 0; }
这样修改后,编译器就不会再报错,curl也能正确识别你拼接的URL了。
内容的提问来源于stack exchange,提问作者Jack Moody
相关产品推荐
相关产品推荐

