我已经阅读了几个地方,c_str()和data()(在STL和其他实现中)之间的区别c_str()是总是空终止而data()不是.据我在实际实现中看到的,他们要么做同样的事情,要么做data()电话c_str().
我在这里错过了什么?在哪种情况下使用哪一个更正确?
在C++ 11之后,我想到了c_str()并且data() 等效.
C++ 17为后者引入了一个重载,返回一个非常量指针(引用,我不确定它是否完全在C++ 17中更新):
const CharT* data() const; (1)
CharT* data(); (2) (since C++17)
Run Code Online (Sandbox Code Playgroud)
c_str() 只会返回一个常量指针:
const CharT* c_str() const;
Run Code Online (Sandbox Code Playgroud)
为什么在C++ 17中区分这两种方法,特别是当C++ 11是使它们成为同构的时候?换句话说,为什么只有一种方法过载,而另一种方法没有?
在C++ 参考的c_str()在std::string出现以下:
返回值
指向基础字符存储的指针.
data()[i] == operator[](i) for every i in [0, size())(直到C++ 11)
data() + i == &operator[](i) for every i in [0, size()](自C++ 11起)
我不明白两者之间的区别,除了自C++ 11以来一个元素的范围增加.
前一种说法data()[i] == operator[](i)对后者来说也不正确吗?
我为什么要打电话std::string::data()过来std::string::c_str()?当然,这里标准的疯狂有一些方法......
我正在使用一个新的init系统#![no_std]和extern crate rlibcasm进行系统调用,并且当前也试图不分配内存.因此,我所拥有的可能工具的范围是有限的.
我需要调用execve系统调用,它需要a char** argv和a char **envp.我可以将c风格的字符串作为零的字节数组合在一起,但是我怎么能无效地终止静态声明的这样的列表(最后一个指针是NULL)?
这是我在网上找到的一个小型图书馆:
const char* GetHandStateBrief(const PostFlopState* state)
{
static std::ostringstream out;
// ... rest of the function ...
return out.str().c_str()
}
Run Code Online (Sandbox Code Playgroud)
在我的代码中,我这样做:
const char *d = GetHandStateBrief(&post);
std::cout<< d << std::endl;
Run Code Online (Sandbox Code Playgroud)
现在,起初d包含垃圾.然后我意识到,当函数返回时,我从函数中获取的C字符串将被销毁,因为它std::ostringstream是在堆栈上分配的.所以我补充说:
return strdup( out.str().c_str());
Run Code Online (Sandbox Code Playgroud)
现在我可以从函数中获取我需要的文本.
我有两个问题:
我理解正确吗?
后来我注意到out(类型std::ostringstream)分配了静态存储.这是不是意味着在程序终止之前该对象应该留在内存中?如果是这样,为什么不能访问该字符串?
我已经阅读了各种描述,std::string::c_str包括多年来/几十年来提出的问题,
我清楚地喜欢这个描述:
返回指向数组的指针,该数组包含表示字符串对象当前值的以空字符结尾的字符序列(即C字符串).此数组包含组成字符串对象值的相同字符序列以及末尾的附加终止空字符('\ 0').
然而,关于此功能目的的一些事情仍然不清楚.
你可以原谅认为调用c_str可能会\0在字符串的末尾添加一个字符,该字符存储在host对象的内部char数组中(std::string):
s[s.size+1] = '\0'
Run Code Online (Sandbox Code Playgroud)
但是,std::string即使在调用之前,默认情况下对象仍然是Null终止c_str:

看完定义后:
const _Elem *c_str() const _NOEXCEPT
{ // return pointer to null-terminated nonmutable array
return (this->_Myptr());
}
Run Code Online (Sandbox Code Playgroud)
我没有看到任何代码会添加\0到char数组的末尾.据我所知,c_str只返回一个指向存储在数组的第一个元素中的char的指针begin().我甚至没有看到检查内部数组被终止的代码\0
或者我错过了什么?
我正在设计一个模拟shell程序,我无法完全模仿"cd"命令.我试过chdir(),但那不起作用,所以我继续试图改变环境变量"PWD ="
这就是我所拥有的,我认为这可能很接近.(如果我错了或与chdir()接近,请拜托,纠正我)
else if (command == "cd")
{
string pathEnv = "PWD=";
string newDir;
cin >> newDir;
pathEnv+=newDir;
cout << pathEnv << endl;
putenv(pathEnv.c_str());
}
Run Code Online (Sandbox Code Playgroud)
希望命令是'cd/user/username/folder',我的pathEnv变量将是"PWD =/user/username/folder",这可能会改变目录?
非常感谢任何见解.
我有这个简单的功能:
const wchar_t *StringManager::GetWCharTStar(int stringId)
{
std::wstring originalString = StringManager::GetString(stringId);
const wchar_t *retStr = originalString.c_str();
return retStr;
}
Run Code Online (Sandbox Code Playgroud)
在该函数的第二行,我有正确的wchar_t*.但是,当我返回时,数据切换到垃圾数据.两者之间没有任何功能.是什么赋予了?!
char el[3] = myvector[1].c_str();
Run Code Online (Sandbox Code Playgroud)
myvector[i] 是一个包含三个字母的字符串.为什么会出现此错误?