将第一个k元素从一个字符串复制到一个新字符串

时间:2015-01-23 20:46:58

标签: c++ string copy

char p[5] = "thks";
string str1(&p[0], &p[strlen(p)]); 
cout<<str1<<endl;

char *p = "thks";
string ptr(p, p+strlen(p));
cout<<str1<<endl;

上面的代码是正确的并且在运行后返回“thks”,它将所有字符从开始到结束从p复制到str1;

string p1 ="thks";
string str2(p1[0],p1[p1.length()]);
cout<<str2<<endl;

当我尝试遵循代码1的格式并编写代码2以实现将第一个k元素从一个字符串复制到一个新字符串时,上面的代码会导致运行时错误,我不明白为什么。

我怎么能让它成功呢?


谢谢大家的所有好评和解决方案。

只想总结一下,让其他人从这里轻松找到解决方案。

任务:将前3个元素从字符串p1复制到str2

解决方案1 ​​:(感谢PeterSW提到结束itoperator需要超过最后一个元素)

string p1 ="thks";
string str2(&p1[0],&p1[p1.length()-1]+1);

解决方案2:

string p1 ="thks";
string str2 = p1.substr(0,3);

解决方案3:

string p1 ="thks";
string str2(p1, 0, 3);

4 个答案:

答案 0 :(得分:3)

p1.length()

给出长度4,但是你想要最后一个3的索引。

所以:

p1[p1.length()]

将尝试访问通过字符串末尾的那个。这是一个未定义的行为,可能是您报告的运行时错误。

Aslo&#39; p1 [0]&#39;将返回一个&#39; char&#39;当构造函数需要迭代器时。

如果您的目标是复制整个字符串,那么您最好使用复制构造函数:

string str2{p1};

可是:

str2(&p1[0],&p1[p1.length()-1]+1); 

如果你坚持使用基于迭代器的构造函数,那么应该可以工作。

答案 1 :(得分:3)

我认为通常你会误用字符串构造函数(docs是here)。您似乎正在尝试调用此特定表单:

  

string(const string&amp; str,size_t pos,size_t len = npos);

因此,如果您只想将str1中的前3个字符复制到str2,请稍微修改您的代码:

string p1 ="thks";
string str2(p1, 0, 3);  //This means copy 3 characters starting from position 0
cout<<"p1 = "<<p1<<endl;
cout<<"str2 = "<<str2<<endl;

这会让你:

p1 = thks
str2 = thk

答案 2 :(得分:0)

您的第二个代码会引发运行时错误,因为您让std :: string为您管理内存。 当调用s [x]时,它会检查x是否在范围内。

答案 3 :(得分:0)

在第一段代码中,您将指针传递给字符串的开头和结尾。

然而,在第二段代码中,您忘记了&符号来制作指针。要更改样本2,使其工作方式与样本1相同:

string p1 ="thks";
string str2( & p1[0], & p1[p1.length()]);
            ^^^      ^^^

但是,这仍然是一个错误:std::string没有空终止符,因此p1[p1.length()]执行越界访问。解决这个问题的一种方法是:

if ( p1.empty() )
    throw......;

string str2( &p1[0], &p1[0] + p1.length() );

当然,在实际代码中你只需写:

string str2( p1 );

这很简单,即使p1为空也可以使用。