如何将std :: string传递给期望char*的函数?

tho*_*ald 2 c++ visual-studio-2010 visual-c++

可能重复:
我可以从C++字符串中获取非const C字符串吗?

我需要先转换它吗?我在另一篇文章中看到,如果函数需要const char*,则可以使用.c_str().只是char*怎么样?

sbi*_*sbi 6

std::vector<char> buffer(s.begin(), s.end());
foo(&buffer[0], buffer.size());
s.assign(buffer.begin(), buffer.end());
Run Code Online (Sandbox Code Playgroud)


Joh*_*ing 6

没有办法摆脱这是保证在所有平台上工作,一个简单的事实,一个串一个char*string使用连续的存储不是必需的.

行动你最安全,最便携的当然是某处复制的字符串,使用contigious存储(vector也许),并用它来代替.

vector<char> chars(my_string.begin(), my_string.end());
char* ptr = &chars[0];
Run Code Online (Sandbox Code Playgroud)

如果你想要hacky和不便携并且显然不安全,你可以确认你的string实现确实使用了有条件的存储,然后可能使用这个:

&my_str[0]
Run Code Online (Sandbox Code Playgroud)

但我会打击任何为我工作的开发人员.

编辑:

我已经意识到目前没有已知的STL实现不会将字符串数据存储在连续的数组中,这样可以确保&my_str[0]安全.在我们即将推出的C++ 0x标准中,存储也必须是连续的.

有人建议,因为如果这些事实证明我的帖子事实上是不正确的.

决定你自己,但我拒绝.这不是当前的 C++标准,因此不是必需的.我仍然会在实践中按照我的建议做事,在任何代码审查中,我都会标记任何假设底层存储是可靠的代码.

考虑一下.假设有一个关于vtable指针的问题.有人想通过查看vtable来检查一个类并获得指向虚函数的指针.我会立即告诉他们不要这样做,因为没有提到如何在C++中实现虚方法.我所知道的每个实现都使用vtable,我想不出更好的方法.多态性很可能会永远使用vtables实现.这样可以直接检查vtable吗?

IMO没有,因为这取决于未记录的实现细节.你无法控制它,它可能随时改变.即使您预计它永远不会改变,依靠这些实现细节仍然是糟糕的工程.

自行决定.

  • @sbi:因为它很糟糕 (4认同)
  • c_str()必须返回具有连续存储的字符串。所以const_cast &lt;char *&gt;(my_string.c_str())是可移植的,但是提出了const_cast是否真的安全的问题。如有疑问,`vector`方法是安全的。 (2认同)