簡體   English   中英

程序中的C ++錯誤

[英]C++ error in program

我的程序出現此錯誤,我不明白為什么。 該代碼本質上必須檢查存儲在聲明為全局變量的集中的標記。 如果它是有效標簽,則將其存儲在堆棧中,否則返回錯誤消息。 然后,它檢查(如果它是一個有效的標簽)結束標簽是否正確。 這就是is_well_formed方法的全部內容。 對於print_well_formed_file方法,它實際上檢查給定文件是否格式正確(如果顯示的話):

terminate called after throwing an instance of 'std::out_of_range'
what():  basic_string::substr

我該怎么辦才能解決此錯誤? 這是代碼的一部分:

bool is_well_formed(ifstream& ifs, string& error_msg) {
    // your code goes here
    string fname, line;
    Token tok;
    Lexer lexer;
    tags.insert("blue");
    tags.insert("red");
    tags.insert("cyan");
    tags.insert("white");
    tags.insert("yellow");
    tags.insert("magenta");
    tags.insert("dim");
    tags.insert("underline");
    tags.insert("bold");
    while (getline(cin, fname)) {
        // tries to open the file whose name is in string fname
        string name = fname.substr(1, fname.length() - 2);
        cout << "Name" + name;
        ifs.open(name.c_str());
        if (ifs.fail()) {
            cerr << "ERROR: Failed to open file " << fname << endl;
            ifs.clear();
        } else {
            while (getline(ifs, line)) {
                lexer.set_input(line);
                while (lexer.has_more_token()) {
                    tok = lexer.next_token();
                    string tmpTok = tok.value;
                    switch (tok.type) {
                    case TAG:
                        // If it has /, remove / from tmpTok
                        if (tok.value[0] == '/') {
                            tmpTok = tmpTok.substr(1, tmpTok.length() - 1);
                        }
                        if (tags.find(tmpTok) == tags.end()) {
                            // Check whether the encountered tag is valid
                            error_return("Tag " + tmpTok + " is invalid!");
                        } else {
                            // Valid Tag encountered
                            stack < string > tagstack;
                            tagstack.push(tmpTok);
                            // Check if the tags are formed properly
                            if (tok.value[0] == '/') {
                                // Remove / from tmpTok
                                string closingTag = tmpTok;
                                string openingTag = tagstack.top();
                                tagstack.pop();
                                if (closingTag.compare(openingTag) != 0) {
                                    error_return(
                                            closingTag + "doesn't match"
                                                    + openingTag);
                                } //else 
                                //  return true; // if the file is well formed
                            }
                        }
                        break;
                    case IDENT:
                        cout << "IDENT: " << tok.value << endl;
                        break;
                    case ERRTOK:
                        error_return("Syntax error on this line\n");
                        //cout << "Syntax error on this line\n";
                        break;
                    case ENDTOK:
                        break;
                    }
                }
            }
        }
    }
    return true; // if the file is well-formed
}

void print_well_formed_file(ifstream& ifs) {
    //Check if file is well formed.
    string line;
    Lexer command;
    if (is_well_formed(ifs, line)) { //if well formed display
        command.set_input(line);
        display(command);
    }

}
void display(Lexer cmd_lexer) {
    string file_name;

    if (!parse_input(cmd_lexer, file_name)) {
        error_return("Syntax error: display <filename>");
        return;
    }

    ifstream ifs(file_name.c_str());
    string error_msg;
    if (ifs) {
        if (!is_well_formed(ifs, error_msg)) {
            error_return(error_msg);
        } else {
            ifs.clear(); // clear EOF flag
            ifs.seekg(0, ios::beg); // go back to the very beginning
            print_well_formed_file(ifs);
        }
    } else {
        error_return("Can't open " + file_name + " for reading");
    }
    ifs.close();
}

用戶輸入的示例:

validate <file name>
display <file name>
exit
string name = fname.substr(1, fname.length() - 2);

如果fname的長度小於等於1,將拋出這種異常。 我敢打賭,情況就是這樣。 最簡單(不是最好)的解決方案是跳過這些行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM