我有这样的功能
void foo (const char* myString){
...
}
我希望像这样使用它
std::string tail = "something";
foo("my" + "string" + tail);
但我找不到一个简单的方法。我肯定可以将字符串放在其他地方并将其传递给foo()
。但是我更喜欢找到一种内联方式,因为在代码中多次调用foo()
,我不想每次都创建一个字符串。我试过了
foo(std::string ("my" + "string" + tail).c_str())
但你可以猜测它不起作用。
答案 0 :(得分:1)
只需确保“我的”是std::string
,然后您就可以使用std::string::operator+
运算符。之后,您会在结果.c_str()
上使用std::string
。
然后,如果您可以更改foo
,最好是让它接受const char*
:
void foo (const char* myString)
{
...
}
std::string tail = "something";
foo( (std::string("my") + "string" + tail).c_str() );
如果您无法更改foo
,那么您必须进行投射,因为c_str()
返回const char*
而foo
想要char*
:
void foo (char* myString)
{
...
}
std::string tail = "something";
foo( const_cast<char*>( (std::string("my") + "string" + tail).c_str() ) );
答案 1 :(得分:1)
"my"
和"string"
是C风格的字符串。它们的类型为const char *
,您不能将operator +
用于这些操作数。但是您可以使用此运算符,任何操作数都是string
。
所以最优雅的方式是添加括号:
foo(("my" + ("string" + tail)).c_str());
您还必须将功能foo
更改为
void foo (const char* myString)
答案 2 :(得分:1)
"my"
和"string"
是C样式的字符串文字,如果它们是而不是 a +
,则它们会被连接起来。 / p>
因此"my" "string" + tail
将起作用,并生成std::string
。但是,除非您对结果使用.c_str()
,否则它仍然不是您的函数的正确类型。
答案 3 :(得分:1)
你的函数接受char
的一个可修改的数组(不再是OP,在他的编辑中改变了)std::string
是而不是一个char
的数组,但是一些不相关的对象(提供读取 - 访问其内部char
缓冲区,但这并不能使它成为某种漂亮的数组)。
此外,使用.c_str()
- 指向被破坏的字符串对象的指针是一个常见的错误。即使你的函数是接受const char*
,你需要知道传入它的指针只有在创建临时std::string
对象的完整表达式结束时才有效。可能会或可能不是你想要的,但你需要注意的是。正如我所说,人们常常弄错了。
所以std::string
可能(在新的const char*
设置中,它可能)不适合这项工作,因为它现在被描述。
最好的解决方案是将foo()
的参数设为std::string
(某些参考变体,取决于它正在做什么)。然后,只要第一个加数之一已经是+
,就可以将输入与std::string
连接起来。
如果无法做到这一点,请将字符复制到std::vector<char>
,这实际上是C ++获取char
数组的方式(同样,string
不同)。
答案 4 :(得分:0)
代码foo("my" + "string" + tail);
因两个原因无效。首先是运营商的顺序。代码尝试执行“my”+“string”,因为这两个都是字符串文字,代码失败。 (你不能加两个字符串文字)。第一个问题是,如果你神奇地使“my”+“string”工作,代码会将它与tail连接,产生有效的std :: string,但是无法将它传递给foo()。
如何解决问题?
foo(const char* )
,或者更好地将其替换为foo(const std::string&)
。foo(std::string("my") + "string" + tail)
如果您遵循我的建议并使foo接受const std :: string&amp;或foo((std::string("my") + "string" + tail).c_str())
,如果您没有。