我做了这个功能
输入字符串是这样的“小狐狸是白色的” 我正在调用此函数myword = my_copy_from(输入,11,3) 我正在跳,我会得到“狐狸”这个词,但是当我使用调试器时,我看到后面的大小是0字节。
为什么? 感谢
// start of my_copy_from //
string my_copy_from(string in,short start,short len)
{
string back ;
short i;
for (i=0 ; i<len; i++)
{
back[i]=' ';
back[i]=in[start+i];
}
return back;
}
// end of my_copy_from //
答案 0 :(得分:4)
将字符串索引到其结尾之外会导致未定义的行为。你很幸运,程序没有崩溃。
您必须提前调整字符串大小。
back.resize(len);
但是,使用substr
成员函数可能更容易。
return in.substr(start, len);
答案 1 :(得分:0)
string back;
创建一个没有分配任何内存的字符串。所以你的for
循环是未定义的行为。它也可能已经崩溃了。在零大小的字符串上做回[i]是没有意义的。
首先使用resize为你的字符串分配内存。
back.resize(len);
在for
循环之前。然后你的程序是有道理的。
在放置实际角色之前插入空格也没有意义。
答案 2 :(得分:0)
使用substr builtin函数。不需要循环。
string my_copy_from(string in,short start,short len)
{
string back ;
short i;
/* for (i=0 ; i<len; i++)
{
back[i]=' ';
back[i]=in[start+i];
}*/
back = in.substr(start,len);
return back;
}
答案 3 :(得分:0)
因为 back 现在是为空,如果你没有指定任何字符串值,也不会明确地保留一些空格,这意味着每次访问返回< / em> via operator []是非法的。尽管没有执行边界检查,但是通过operator []进行访问超出索引范围会导致未定义的行为,并且很幸运,编译器会忽略它。
要解决此问题,您可以为返回
显式保留一些空间string s;
s.reserve(len); // or s.resize(len);
或使用函数追加
string s;
s.append(in, start, len);
实际上,在字符串中已经有一个名为substr的函数做同样的事情。
string s = in.substr(start, len);