void Display::displayText(const char* text) {
using std::string;
using std::vector;
string line = string(text);
vector<string> temp(1);
if (Display::startLine < 0) Display::startLine = 0;
bool cont = true;
int lastRegex = 0;
int regex = 1;
string tmp = string(" ");
for (int i=0; i<line.length(); i++) {
if(line.at(i)=='\n') {
tmp = line.substr(lastRegex, i-lastRegex);
tmp.erase(tmp.find("\n"), tmp.find("\n"));
lastRegex = i+1;
regex++;
temp.resize(regex);
temp[regex-1] = tmp;
}
if (i - lastRegex == COLS-3) {
bool b = true;
int j = i;
while (b) {
if (line.at(i) == ' ') {
b = false;
tmp = line.substr(lastRegex, j-lastRegex);
lastRegex = j+1;
regex++;
temp.resize(regex);
temp[regex-1] = tmp;
}
j--;
}
}
}
regex++;
temp.resize(regex);
temp[regex-1] = line.substr(lastRegex, string::npos);
if (Display::startLine+1 > temp.size()) Display::startLine = temp.size()-1;
for (int i=0; i<temp[startLine].length(); i++) Window::draw(i+1, 1, temp[Display::startLine].at(i));
if (Display::startLine+1 <= temp.size()-1)
for (int i=0; i<temp[Display::startLine+1].length(); i++) Window::draw(i+1, 2, temp[Display::startLine].at(i));
if (Display::startLine > 0) Window::draw(COLS-2, 1, '^');
if (Display::startLine + 1 < temp.size()-1) Window::draw(COLS-2, 2, 'v');
}
}
此代码正确编译。但是,当我运行它时,std::out_of_range
出现std::basic_string::at
错误。
我试图添加一个检查if line是否为空,并更改for循环使其为.length()-1
,但这两者产生相同的结果。
此函数应该接收文本,并将其显示在窗口的顶部两行(因此为COLS变量和Window::draw
),并在文本的行尾添加箭头扩展到两条线。我当前正在输入的文本引发错误的是#34; Hello World!&#34;。
如果我用Window::draw
手动显示相同的文字,那么绘图功能不会出现问题。 (此方法专门用于自动将文本环绕屏幕并将其限制在两行)
答案 0 :(得分:1)
字符串是从0开始编制索引的字符数组。如果要访问第一个字符,则在位置0,如果要访问最后一个字符,则其位置长度为-1。
例如,string test =&#34; hello&#34;;
test.at(0)会给我&#39; h,#test; at(4)会给我&#39; 0&#39;,test.at(5)= test.at( test.length())=超出范围错误
将for循环更改为
for (int i=0; i<line.length() - 1; i++) {