如何将字符串和常量字符拼接?

24

我需要在C语言中输出“hello world”。如何实现?

string a = "hello ";
const char *b = "world";

const char *C;
2个回答

45
string a = "hello ";
const char *b = "world";
a += b;
const char *C = a.c_str();

或者不修改a

string a = "hello ";
const char *b = "world";
string c = a + b;
const char *C = c.c_str();

稍作修改以匹配111111给出的信息。

如果您已经有了字符串(或const char *,但我建议将后者转换为前者),您可以将它们“相加”以形成更长的字符串。但是,如果您想要附加除已有字符串之外的内容,则可以使用stringstream及其operator<<,它的工作原理与cout的一样,但不会将文本打印到标准输出(即控制台),而是打印到它的内部缓冲区中,您可以使用它的.str()方法从中获取std::string

std::string::c_str()函数返回包含在其中的字符串的指向const char缓冲区(即const char *)的指针,该指针以空字符结尾。然后,您可以像使用任何其他const char *变量一样使用它。


2
更好的方法是 const char *C = (a + b).c_str();。它不会修改 string a - iammilind
12
(a + b).c_str()会让C指向无效的内存,因为+创建了一个临时的string,当语句结束时,该临时对象将超出作用域并被销毁。将(a + b).c_str()传递给函数参数时,这没有问题,但是赋值给变量时就不行。 - Remy Lebeau
@RemyLebeau,谢谢,你发现得很好 - 我只是毫无意识地将那个评论并入了答案。 - Griwes

10

如果只需要连接字符串,那么可以使用 operator +operator += 函数。

 #include <string>
 ///...
 std::string str="foo";
 std::string str2=str+" bar";
 str+="bar";

但是,如果您需要执行大量字符串拼接操作,则可以使用字符串流(string stream)。

#include <sstream>
//...
std::string str1="hello";
std::stringstream ss;
ss << str1 << "foo" << ' ' << "bar" << 1234;
std::string str=ss.str();

编辑:然后你可以将该字符串传递给一个使用c_str()的C函数,以便接受const char *类型的参数。

my_c_func(str1.c_str());

如果 C 函数接受非 const char* 或需要所有权,则可以执行以下操作:

char *cp=std::malloc(str1.size()+1);
std::copy(str1.begin(), str2.end(), cp);
cp[str1.size()]='\0';

你没有看到问题中的“...在C中放置[...]”部分。 - Griwes
@Griwes 我添加了一点更多的内容。 - 111111

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接