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);
答案 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
为空也可以使用。