0

我做了这个功能

输入字符串是这样的“小狐狸是白色的”我正在调用这个函数 myword=my_copy_from(input,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 //
4

4 回答 4

4

超出字符串结尾的索引会导致未定义的行为。你很幸运,程序没有崩溃。

您必须提前调整字符串的大小。

back.resize(len);

substr但是,使用成员函数可能更容易。

return in.substr(start, len);
于 2013-04-14T11:21:12.927 回答
0

因为如果你不分配任何字符串值,也不显式保留一些空间,那么现在后面的,这意味着通过 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); 
于 2013-04-14T11:51:23.653 回答
0
string back;

创建一个没有分配任何内存的字符串。所以你的for循环是未定义的行为。它也可能崩溃了。在大小为零的字符串上执行 back[i] 没有意义。

首先使用调整大小为您的字符串分配内存。

back.resize(len);

在你的for循环之前。那么你的程序就有意义了。

在放置实际字符之前插入空格也是没有意义的。

于 2013-04-14T11:23:24.747 回答
0

使用 substr 内置函数。不需要 for 循环。

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;
}
于 2013-04-14T11:24:49.190 回答