1

我有这个问题,每当我尝试通过 libcurls http post 发送我的 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);
4

3 回答 3

7

当你使用时,tmp_s.str()你会得到一个临时字符串。您不能保存指向它的指针。您必须将其保存到 astd::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());

但我不知道该函数是复制字符串还是只是保存指针,所以第一种选择(使用 a std::string)可能是最安全的选择。

于 2013-03-01T10:21:45.543 回答
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();

可能对你有用。

于 2013-03-01T10:22:32.060 回答
0

尝试删除static存储说明符,编译并运行。

注意:即使c_str()结果名义上是暂时的,它也可能是(并且通常是)永久的。为了快速修复,它可能会起作用。

于 2013-03-01T10:25:41.773 回答