C ++中的c_str()和char *不等

时间:2018-10-03 01:30:27

标签: c++ twitter oauth libcurl

我相信我刚刚找到了过去几天困扰我的错误,但是它的含义却使我头疼不已。

我在使用本地libcurl工具(在/ usr / lib中)的macOS mojave计算机上,但是我不认为cURL本身就是问题。

我一直在尝试使用以下代码向Twitter提交OAuth2请求,正确提供了所有标头(未显示)。

// supplying https://api.twitter.com/oauth2/token?grant_type=client_credentials for ease of use
curl_easy_setopt(curl, CURLOPT_URL, "https://api.twitter.com/oauth2/token");
std::string grantType = "grant_type=client_credentials";
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, grantType.c_str());

但是,这失败,并显示状态代码

{"errors":[{"code":170,"message":"Missing required parameter: grant_type","label":"forbidden_missing_parameter"}]}

很困惑,我试了一下:

curl_easy_setopt(curl, CURLOPT_URL, "https://api.twitter.com/oauth2/token");
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "grant_type=client_credentials");

最适合的方式:

{"token_type":"bearer","access_token":"AAAAAAAAAAAAAAAAAAAAAIMu6QAAAAAArr86Rv2W70fTicd4yAir7..."}

所以我要么不理解C ++的关键方面,要么就是打破了宇宙—为什么调用c_str()不会得到相同的输出?

我还一直在一个单独的项目中运行以下内容,以尝试弄清正在发生的事情。

std::string string1 = "test";
char* string2 = "test";
assert((strcmp(string1.c_str(), string2)) || (string1.c_str() == string2));

为什么定义char *不会产生与定义字符串然后调用c_str()相同的值?

2 个答案:

答案 0 :(得分:1)

原来实际上是字符串生命周期问题,这改变了igel指出:CURL_POSTFIELDS必须在执行的稍后一点访问字符串值,但是此时字符串已经超出范围并已从中删除记忆。将变量创建为方法的参数时,必须自动创建不会被编译器快速破坏的char *文字,从而导致上述行为。谢谢您的帮助!

答案 1 :(得分:0)

仅考虑您的第二个项目,即代码中的assert校验的第二部分:

std::string string1 = "test";
char* string2 = "test";
assert((strcmp(string1.c_str(), string2)) || (string1.c_str() == string2));

比较存储string1.c_str()的地址和存储string2的地址,它们将有所不同。