【问题标题】:Simple assignment of characters from one string to other is not working将字符从一个字符串简单分配到另一个字符串不起作用
【发布时间】:2019-10-22 20:31:42
【问题描述】:

我正在尝试将一个字符串中的字符分配给另一个使用函数,但出现错误。

"在抛出 'std::out_of_range' 的实例后调用终止 what(): basic_string::at: __n (0) >= this->size() (0)"

#include <iostream>
#include <string>
#include <vector>

void split (std::string line)
{
    std::string::size_type leng=0;
    leng=line.length();
    std::string k;

    for (long unsigned int i=0;i<leng; i++)
    {
        k.at(i)=line.at(i);
    }

    std::cout<<k;
}

int main()
{
    std::string line = "";
    std::cout << "Enter a string: ";
    getline(std::cin, line);
    split(line);
}

【问题讨论】:

    标签: c++


    【解决方案1】:

    当您初始化k 时,它是一个空字符串。因此,k.at(i) 将超出错误消息的范围。

    有很多方法可以复制字符串,您可以使用std::string k(line);k.assign(line) 之类的构造函数,也可以使用resize() 在循环前调整k 的大小。

    【讨论】:

      【解决方案2】:

      抛出此异常是因为任何创建的没有初始内容的新字符串的长度为 0。 通过at() 访问字符期望索引有一个字符,但k 没有任何值即使在0​​

      可以先调整字符串大小,然后使用at()

      std::string k;
      k.resize(leng);
      

      【讨论】:

        【解决方案3】:
        #include <iostream>
        #include <string>
        
        void split (std::string line)
        {
            std::string::size_type leng = line.length();
            std::string k;
        
            for (long unsigned int i = 0; i < leng; i++)
            {
                k.push_back(line.at(i));  // This is the only real change
            }
        
            std::cout << k;
        }
        
        
        int main()
        {
            std::string line = "";
            std::cout << "Enter a string: ";
            getline(std::cin, line);
            split(line);
        }
        

        k 被声明时,它是空的。因此它的大小为 0。您正在使用 .at() 函数,该函数访问特定元素(字符)并在超出范围时引发异常。你会立即越界,因为k 是空的。

        现在,您的功能没有拆分(还没有,或者您遗漏了该部分),但.push_back() 似乎适合您想要做的最好的事情。它将字符添加到字符串的末尾,并根据需要增加字符串;您不必担心手动管理其大小。

        【讨论】:

          【解决方案4】:

          您正在尝试访问一个空字符串的元素,请使用此代码。

          #include <iostream>
          #include <string>
          
          void split (const std::string& line) // pass parameter by reference to avoid copy
          {
              std::string::size_type leng = line.length();
              std::string k;
              k.resize(leng); // use resize to create space for the new characters
          
              for (long unsigned int i = 0; i < leng; i++)
              {
                  k.at(i)=line.at(i);
              }
          
              std::cout << k;
          }
          
          int main()
          {
              std::string line = "";
              std::cout << "Enter a string: ";
              getline(std::cin, line);
              split(line);
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-10-13
            • 1970-01-01
            • 1970-01-01
            • 2020-04-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多