字符串大小保持为零

时间:2013-04-14 11:16:48

标签: c++

我做了这个功能

输入字符串是这样的“小狐狸是白色的” 我正在调用此函数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 //

4 个答案:

答案 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);