C++字符串_Xout_of_range("无效的字符串位置");

C++ string _Xout_of_range("invalid string position");

本文关键字:字符串 位置 无效 Xout of range C++      更新时间:2023-10-16

我是C++新手。我有一个作业,要求我根据输入执行一系列操作。代码似乎有效,但当我的字符串大小达到 16 时停止。尝试了 2 个测试用例。

输入是一个整数,后跟换行符,后跟字母数字 + 空格 + "[' 或 ']' 或 '<' 示例:

1
my ]]name]] is]] joha<n]<n doe]]]]]

法典:

int main() {
int TC; cin >> TC; cin.get(); //absorb newline
while (TC--) {
string s1;
string::iterator itr = s1.begin(); //move using iterators
while (1) {
char c;
cin.get(c);
if (c == '[') { //move to first element
itr = s1.begin();
}
else if (c == ']') { // move to last element
itr = s1.end();
}
else if (c == '<') {
if (s1.length() > 0) {
itr--;
s1.erase(itr); //erase current position
}
}
else if (c == 'n') { //cout at newline char
cout << s1 << endl;
break;
}
else {  //add to string
s1.insert(itr, c);
itr++;
}
cout << s1 << ' ' << s1.size() << endl; //checking
}
}
return 0;
}

使用插入或擦除等操作后,迭代器可能无效。

您需要使用从这些成员函数返回的迭代器。

这是一个演示程序。

#include <iostream>
#include <string>
#include <limits>
#include <sstream>
int main() 
{
std::string input( "1nmy ]]name]] is]] joha<n]<n doe]]]]]n" );
std::istringstream iss( input );
size_t n;
iss >> n;
iss.ignore( std::numeric_limits<std::streamsize>::max(), 'n' );
while ( n-- )
{
std::string s;
char c;
auto it = s.end();
while ( iss.get( c ) && c != 'n' )
{
switch ( c )
{
case ']':
it = s.end();
break;
case '[':
it = s.begin();
break;
case '<':
if ( it != s.begin() )
{
it = s.erase( --it );
}                   
break;
default:
it = s.insert( it, c );
++it;
break;
}
}
std::cout << s << 'n';
}
return 0;
}

它的输出是

my name is john doe