为什么 libcurl 在 JSON 响应字符串后返回"0"?
Why is libcurl returning a "0" after the JSON response string?
我正在尝试将图像上传到imgur API。我尝试使用邮递员 REST 客户端,它完全返回我想要的内容。当我在C++中使用 libcurl 时,它会返回以下内容:
{"data":{"id":"NsmDwZN","title":null,"description":null,"datetime":1494462656,"type":"image/png","animated":false,"width":28,"height":22,"size":336,"views":0,"bandwidth":0,"vote":null,"favorite":false,"nsfw":null,"section":null,"account_url":null,"account_id":0,"is_ad":false,"in_most_viral":false,"tags":[],"in_gallery":false,"deletehash":"...","name":"","link":"..."},"success":true,"status":200}
0
那个 0 从何而来?
这是我的主要开机自检代码:
int postToImgur(std::string file)
{
curl_global_cleanup();
CURL *curl;
CURLcode res;
// Init winsock stuff
curl_global_init(CURL_GLOBAL_ALL);
// Get curl handle
curl = curl_easy_init();
struct curl_httppost *formpost = NULL;
struct curl_httppost *lastptr = NULL;
struct curl_slist *headerlist = NULL;
if (curl) {
curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "image", CURLFORM_FILE, file.c_str(), CURLFORM_END);
headerlist = curl_slist_append(headerlist, "Expect:");
headerlist = curl_slist_append(headerlist, "Authorization: Client-ID bea02xxxxxaf4");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
curl_easy_setopt(curl, CURLOPT_URL, "https://api.imgur.com/3/image");
curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
MessageBox(NULL, _T("Could not upload image. Please check your internet connection."), _T("Error"), NULL);
}
curl_easy_cleanup(curl);
curl_formfree(formpost);
curl_slist_free_all(headerlist);
}
return 0;
}
在我的write_callback函数中,我只需执行以下操作:
size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata)
{
CStringA responseStringA(ptr);
OutputDebugStringA((LPCSTR) responseStringA);
它输出一个"0"。这破坏了我的解析,我不得不手动删除 0,但必须这样做似乎有点草图。关于我可以从哪里得到这个 0 的任何建议?
感谢戴的帮助。Libcurl 不会将响应中的ptr
作为以 null 结尾的字符数组传递。这就是我的错误来源。我想我有一个有效的解决方案来创建另一个(更大的)char 数组,复制前一个,并将最后一个字符设置为 null 终止符号。
请检查我的解决方案,并让我知道我是否以某种方式搞砸了:
size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata)
{
char * responseString = new char[nmemb + 1]();
strncpy(responseString, ptr, nmemb);
responseString[nmemb] = ' ';
OutputDebugStringA(responseString);
...
}
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- QueryWorkingSet总是返回false
- (C++)分析树以计算返回错误值的简单算术表达式
- 访问者访问变体并返回不同类型时出错
- 如何返回一个类的两个对象相加的结果
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- lower_bound()返回最后一个元素
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何取消对nullptr的屏蔽,返回正确的对象
- 奇怪的结构&GCC&clang(void*返回类型)
- 架构决策:返回std::future还是提供回调
- 从python中调用C++函数并获取返回值
- 矩阵向量乘法(cublasDgemv)返回零
- “并非所有控制路径都返回一个值./&quot“控制可能达到非空隙功能的末端”.验证时循环时