将字符从一个字符串简单分配到另一个字符串不起作用

Simple assignment of characters from one string to other is not working

本文关键字:字符串 简单 分配 不起作用 另一个 一个 字符      更新时间:2023-10-16

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

"在抛出'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);
}

当你初始化k它是一个emtpy字符串。因此,正如错误消息所说,k.at(i)将超出界限。

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

引发此异常是因为在初始内容中创建的任何新字符串都具有 0 len。 通过at()访问字符时,索引具有字符,但即使在0 时,k也没有没有值。

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

std::string k;
k.resize(leng);
#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()它似乎适合你最擅长的事情。它会将字符添加到字符串的末尾,并根据需要增加字符串;您不必担心手动管理其大小。

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

#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);
}