【问题标题】:string size stays zero字符串大小保持为零
【发布时间】:2013-04-14 11:16:47
【问题描述】:

我做了这个功能

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

【问题讨论】:

  • 为什么不使用int 而不是short
  • back[i] = ' ';。这不是无用的说法吗?

标签: c++


【解决方案1】:

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

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

back.resize(len);

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

return in.substr(start, len);

【讨论】:

    【解决方案2】:
    string back;
    

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

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

    back.resize(len);
    

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

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

    【讨论】:

      【解决方案3】:

      使用 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;
      }
      

      【讨论】:

        【解决方案4】:

        因为 back 现在是 empty 如果您不分配任何字符串值也不明确保留一些空间,这意味着每次访问 back 通过 operator[] 是非法的。尽管没有执行边界检查,通过超出索引范围的 operator[] 访问会导致未定义的行为,幸运的是您的编译器只是忽略了它。

        为了解决这个问题,你可以明确地为back

        保留一些空间
        string s;
        s.reserve(len); // or s.resize(len);
        

        或使用函数追加

        string s;
        s.append(in, start, len);
        

        实际上,string 中已经有一个名为 substr 的函数在做同样的事情。

        string s = in.substr(start, len); 
        

        【讨论】:

          猜你喜欢
          • 2021-11-11
          • 1970-01-01
          • 1970-01-01
          • 2013-06-01
          • 2013-10-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-24
          相关资源
          最近更新 更多