C ++ std :: string :: at throw std :: out_of_range

时间:2014-06-21 20:06:54

标签: c++ string c++11 stdstring

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手动显示相同的文字,那么绘图功能不会出现问题。 (此方法专门用于自动将文本环绕屏幕并将其限制在两行)

1 个答案:

答案 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++) {