如何在C++中复制std::string类型的字符串?

61

我使用了 strcpy() 函数,但它只在我使用 C 语言字符串数组时才有效:

char a[6] = "text";
char b[6] = "image";
strcpy(a,b);

但是每当我使用

string a = "text";
string b = "image";
strcpy(a,b);

我遇到了这个错误:

functions.cpp: no matching function for call to strcpy(std::string&, std::string&)

如何在C++中复制两个字符串(类型为string)?


17
只是 a=b; :D - PiotrNycz
你应该使用std :: string类型,而不是使用strcpy,而是使用复制赋值。 - Basile Starynkevitch
4个回答

89

不应该使用strcpy()来复制std::string,只能用于C风格字符串

如果您想将a复制到b,只需使用=运算符即可。

string a = "text";
string b = "image";
b = a;

而 strcat() 呢?它是 a=a+"image" 吗? - Muhammad Arslan Jamshaid
7
对于strcat函数,你可以使用a+="image"。 - Caesar
1
所有的strcpy、strcat、strtok等函数都是string.h库中仅对c字符串操作的函数,即仅由以null结尾的字符数组组成的字符串。如果出于方便,您有一个字符串对象,并且仍想使用一些string.h函数,则可以在字符串对象上调用str.c_str()函数,它基本上返回对象内容的c字符串。然而,这很少需要,因为字符串对象有一个相当好的api。 - fkl
@Caesar,请回答这个问题:链接;谢谢。 - uss
如果我想将一个“在堆栈上”的字符串副本(例如,通过函数调用传递)放入一个位于堆上的结构体中,这仍然有效吗? - Samarth Ramesh
是按引用复制还是按值复制? - Sachin

22

strcpy仅适用于C字符串。对于std::string,您可以像任何C++对象一样进行复制。

std::string a = "text";
std::string b = a; // copy a into b

如果你想要连接字符串,你可以使用加号+运算符:
std::string a = "text";
std::string b = "image";
a = a + b; // or a += b;

你甚至可以一次性做许多个:

std::string c = a + " " + b + "hello";

尽管"hello" + " world"并不像你期望的那样工作,但需要在其中放置一个明确的std::string:std::string("Hello") + "world"


而对于std :: string,strcat的替代方法是什么? - Muhammad Arslan Jamshaid
1
@程序员 你可以使用 + 来组合字符串:std::string a = "text"; std::string b = "image"; a = a+b; - bames53
1
@PiotrNycz他要求复制,但没有指定复制赋值或复制构造函数,可能是因为这种区别对于C字符串来说没有意义。新的C++程序员通常不理解初始化和赋值之间的区别,语法故意相似。我认为在这里区分没有任何意义。 - bames53
如果原始数据被反转,那么副本是否会发生变异? - mLstudent33
1
@mLstudent33 不是的,std::string的复制是完全独立的。 - bames53
显示剩余2条评论

4

凯撒的解决方案是我认为最好的,但如果你仍然坚持使用strcpy函数,那么当你准备好你的字符串之后:

string a = "text";
string b = "image";

您可以尝试以下两种方法之一:

方法一:

strcpy(a.data(), b.data());

或者

strcpy(a.c_str(), b.c_str());

只需调用 std::string 类的 data()c_str() 成员函数,即可获得字符串对象的 char* 指针。
strcpy() 函数没有重载来接受两个 std::string 对象作为参数。它只有一种重载形式,接受两个 char* 指针作为参数。
datac_str 都返回 strcpy() 需要的内容。

它只有一个重载。这是真的吗?难道不是没有重载吗?或者这就是我理解重载概念的方式。 - RichieHH
如果你有使用这个的冲动,请冷静一下,最好还是不要使用。底层缓冲区的大小仅保证与C字符串的大小相同。将“image”适配到“text”中可能不会导致可怕的事情发生,但会导致字符串“imag”,因为std::string的长度是存储的而不是由终止字符评估的。此外,第二种变体可能甚至无法编译,因为c_str()返回一个const char * - pogojotz

4

strcpy示例:

#include <stdio.h>
#include <string.h>

int main ()
{
  char str1[]="Sample string" ;
  char str2[40] ;
  strcpy (str2,str1) ;
  printf ("str1: %s\n",str1) ;
  return 0 ;
}

输出:str1: 示例字符串

您的情况:

一个简单的=操作符就可以完成任务。

string str1="Sample string" ;
string str2 = str1 ;

这是否意味着无法将一个字符串类型转换为另一种类型? - user1710917

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