问题描述
我正在尝试制作一个将字符串转换为字符数组的程序。我的代码看起来像这样(这只是我代码的一部分):
#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);
}
}
以 std::out_of_range 类型的未捕获异常终止:basic_string 中止
不知道为什么会发生这种情况。请帮我修复它,感谢你阅读它。
解决方法
您的代码中有一些错误:
-
您使用的是可变长度数组,即 not standard C++。动态数组需要用
new[]
分配(或者更好,用std::vector
)。 -
您的循环超出了
std::string
的边界。at()
方法执行边界检查,为索引 >=std::out_of_range
抛出size()
异常。您的循环条件需要使用<
而不是<=
。
试试这个:
#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] = '\0';
// 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...
}
,
您写入的字符超出了 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] = '\0'; //very important
超出范围的读取或写入在 C/C++ 中是一件坏事。黑客可以利用这一点来使您的程序生病... 注意:我没有测试……我直接用手机写的