【问题标题】:string conversion to const char * problems字符串转换为 const char * 问题
【发布时间】:2013-02-15 19:25:21
【问题描述】:

我有这个问题,每当我尝试通过 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);

【问题讨论】:

  • 你的代码调试了吗?
  • 我已经尝试使用wireshark查看数据包和Eclipse中的调试模式查看变量,但我自己找不到错误。
  • 为什么是wireshark?问题出在代码中。使用 valgrind(如果在 linux 上)或适当的工具(在其他平台上)
  • @BЈовић ,那是查看 libcurl 发布服务器的数据包。这样我就可以确定问题出在哪里,因为在发布之前使用 cout 时,我得到了与我想要的完全相同的字符串。但是在那和 POST 之间的某个地方,字符串发生了变化。这现在很有意义,因为我指的是内存中可以被随机数据覆盖的地方。
  • 好吧,对不起。谢谢你告诉我。

标签: c++ string char constants libcurl


【解决方案1】:

当您使用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)可能是最安全的选择。

【讨论】:

  • 感谢您的快速回复!但我已经尝试过你所说的,我仍然得到同样的错误。
  • 因为他只使用字符串,他可能会完全跳过字符串流,只是将它连接到一个字符串对象中,从而避免了这个问题。
  • @typ0 您是否将其设置在与curl_easy_perform 不同的单独函数中?还是两个调用都在同一个函数中?请发送SSCCE 并用它更新您的问题。
  • 感谢您的快速回复!第一部分像一个魅力,第二部分没有。
  • 我认为显示其余代码是相当无关紧要的,因为问题与字符串有关,而不是与 libcurl 调用有关,结果证明是由于错误使用了指针。是的,这些调用在同一个函数中。而且我不确定我能说得更清楚。 @scones,这似乎也有效,谢谢。
【解决方案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();

可能对你有用。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 这并没有什么不同,但我也发现了这张纸条。也感谢您的宝贵时间。
    猜你喜欢
    • 2013-07-25
    • 2020-01-20
    • 2014-05-16
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多