以 std::out_of_range 类型的未捕获异常中止错误终止

Terminating with uncaught exception of type std::out_of_range aborted error

我正在尝试制作一个将字符串转换为字符数组的程序。我的代码看起来像这样(这只是我代码的一部分):

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string Word;
    cout << "Type A String And I'll Turn It Into A Char Array ' : ";
    cin >> Word;
    int Length = Word.length();
    char Char_Word[Length];
    //Looping To Set The String Characters To A Char Array
    for (int CharSet = 0; CharSet <= Length; CharSet++)
    {
        Char_Word[CharSet] = Word.at(CharSet);
    }
}

但是当我运行这段代码并给它一个输入时它输出这个语句

terminating with uncaught exception of type std::out_of_range: basic_string Aborted

不知道为什么会这样。请帮我修复一下,谢谢你的阅读。

您写的超出了 char_word 变量的范围。

//First make enough space for char_word
int length = word.length()+1;
char Char_word[ length ];
for( int i = 0; i < length - 1; i++)
     Char_word[i] = word.at(i);
Char_word[length-1] = '[=10=]'; //very important

读取或写入超出范围在 C/C++ 中是一件坏事。这是一个很好的点,黑客可以利用它来使你的程序生病...... 注意:我没有测试它......我直接从我的 phone

写的

你的代码有一些错误:

  • 您正在使用可变长度数组,即not standard C++。动态数组需要分配 new[](或者更好,std::vector)。

  • 您的循环超出 std::string 的范围。 at() 方法执行边界检查,对索引 >= size() 抛出 std::out_of_range 异常。您的循环条件需要使用 < 而不是 <=.

试试这个:

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string Word;
    cout << "Type A String And I'll Turn It Into A Char Array ' : ";
    cin >> Word;
    size_t Length = Word.length();
    char *Char_Word = new char[Length+1];
    //Looping To Set The String Characters To A Char Array
    for (size_t CharSet = 0; CharSet < Length; CharSet++)
    {
        Char_Word[CharSet] = Word[CharSet];
    }
    Char_Word[Length] = '[=10=]';
    // use Char_Word as needed...
    delete[] Char_Word;
}

然而,也就是说,std::string 已经是一个 char[] 数组。您可以使用字符串的 c_str()data() 方法获取指向字符串底层数组的指针。

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string Word;
    cout << "Type A String And I'll Turn It Into A Char Array ' : ";
    cin >> Word;
    const char *Char_Word = Word.c_str();
    // use Char_Word as needed...
}