我遇到这个问题,每当我尝试通过libcurls发送我的post_data1时,它会说错误的密码,但是当我在post_data2中使用固定表达式时,它会让我登录。而当我输出它们时,它们是完全相同的字符串。 。
当libcurl将它们放入标题时,有人能告诉我为什么它们不一样吗?或者在发送之前他们为什么会有所不同,如果是这样的话。
string username = "mads"; string password = "123";
stringstream tmp_s;
tmp_s << "username=" << username << "&password=" << password;
static const char * post_data1 = tmp_s.str().c_str();
static const char * post_data2 = "username=mads&password=123";
std::cout << post_data1 << std::endl; // gives username=mads&password=123
std::cout << post_data2 << std::endl; // gives username=mads&password=123
// Fill postfields
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_data1);
// Perform the request, res will get the return code
res = curl_easy_perform(curl);
答案 0 :(得分:7)
当您使用tmp_s.str()
时,您会收到临时字符串。您无法保存指向它的指针。您必须将其保存到std::string
并在通话中使用该字符串:
std::string post_data = tmp_s.str();
// Post the data
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_data.c_str());
如果(且仅当)curl_easy_setopt
复制字符串(而不是只保存指针),您可以在调用中使用tmp_s
:
// Post the data
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, tmp_s.str().c_str());
但我不知道该函数是复制字符串还是仅保存指针,因此第一种选择(使用std::string
)可能是最安全的选择。
答案 1 :(得分:2)
static const char * post_data1 = tmp_s.str().c_str();
是个问题。它返回一个字符串对象,然后获取指向该对象内部字符串数据的指针。然后该字符串在该行的末尾超出范围,因此您将留下一个指向...接下来在该内存中发生的任何事情。
static std::string str = tmp_s.str();
static const char* post_data1 = str.c_str();
可能会为你工作。
答案 2 :(得分:0)
尝试删除static
存储说明符,编译并运行。
注意:即使c_str()
结果名义上是临时的,也可能(并且通常是)永久性的。为了快速解决问题,它可能会有效。