表达式:字符串下标超出范围。属性传递问题?

时间:2014-02-06 02:12:43

标签: c++ string methods char subscript

我在程序运行时遇到错误:
“Debug Assertion Failed!... Expression:字符串下标超出范围。”

当我的if语句尝试检查字符串中的'i'处的字符是否为Delimiter()或isOperator()时,我的for循环中发生了这种情况。我将char'check'作为属性传递,并且在评论中我确保'check'正在抓取正确的字符。我一直在研究这个问题,我似乎无法解决它。

在底部编辑

    string inputLine = "";
    string inputString = "";

    int main()
    {
        ifstream input("input.txt");
        getline(input, inputLine);

        if (input.is_open())
        {
            while (!input.eof())
            {
                getline(input, inputLine);

                for (int i = 0; i<inputLine.length(); i++)
                {
                    char check = inputLine[i];
                    //cout << check << "\n"; // test for correct character

                    if ((inputLine[i] != ' ') || (inputLine[i] != isDelimiter(check)) || (inputLine[i] != isOperator(check)))
                    {
                        inputString = inputString + inputLine[i];
                        //cout << lexer(inputString) << "\n";
                        //cout << inputString;
                    } // end if
                    else
                    {
                        cout << lexer(inputString);
                        if (inputLine[i] == isDelimiter(i))
                    cout << inputLine[i] + "\tDELIMITER";
                        if (inputLine[i] == isOperator(i))
                            cout << inputLine[i] + "\tOPERATOR";
                        inputString = "";
                    } // end else
                    //cout << inputString << "\n";
                } // end for
            } // end while
            //input.close();
        }
        else cout << "Unable to open file.";

        return 0;
    }

这是isDelimiter()和isOperator()方法。

    bool isOperator(char c)
    {
        if ((inputLine[c] == '+') || (inputLine[c] == '-') || (inputLine[c] == '*') || (inputLine[c] == '/') || (inputLine[c] == '=') || (inputLine[c] == '%') || (inputLine[c] == '<') || (inputLine[c] == '>'))
            return true;
        else
            return false;
    }

    bool isDelimiter(char c)
    {
        if ((inputLine[c] == ';') || (inputLine[c] == '(') || (inputLine[c] == ')') || (inputLine[c] == ','))
            return true;
        else
            return false;
    }

感谢任何帮助!

EDIT ::

在审查了我的代码后,我意识到了这个错误,但我仍然有另一个错误。那个运行时错误是因为在我的isOperator()和isDelimiter()函数中,我正在检查inputString [c]而不仅仅是'c'。愚蠢的错误,我知道。但是,虽然不再出现错误,但程序仍会跳过检查isOperator()和isDelimiter()方法,并且只在读取''时才进入else语句。为什么它不会进入我的运算符和分隔符的else语句?

2 个答案:

答案 0 :(得分:1)

您的功能需要char,将其更改为int

bool isDelimiter(char c) //should be int
{
    if ((inputLine[c] == ';') || (inputLine[c] == '(') || (inputLine[c] == ')') || (inputLine[c] == ','))
        return true;
    else
        return false;
}

答案 1 :(得分:0)

我明白了,即使它们是简单的错误,也许它会在将来帮助某人。毕竟,我被困了一段时间。

它们主要是语法错误,我真的需要梳理我的编码。

这是我的功能现在遵循的格式。请注意,我终于传递了正确的值。

    bool isDelimiter(char c)
    {
        if ((c == ';') || (c == '(') || (c == ')') || (c == ','))
            return true;
        else
            return false;
    }

这就是我现在称呼他们的方式。我试图检查输入本身是否等于函数,这就像询问“helloworld”== TRUE。显然这不起作用,一旦我想出来,我就想踢自己。这是片段:

            if ((inputLine[i] == ' ') || (isDelimiter(check)) || (isOperator(check)))
            {
                cout << lexer(inputString);
                if (isDelimiter(check))
                {
                    cout << inputLine[i] << "\t\tDELIMITER\n";
                }
                if (isOperator(check))
                {
                    cout << inputLine[i] << "\t\tOPERATOR\n";
                }
                inputString = "";

            } // end if
            else
            {
                inputString = inputString + inputLine[i];
            } // end else

这解决了我的基本问题,现在解决了更大的问题。