【问题标题】:Expression: string subscript out of range. Attribute passing issue?表达式:字符串下标超出范围。属性传递问题?
【发布时间】:2014-03-02 19:06:03
【问题描述】:

我在程序运行时遇到错误:
“调试断言失败!...表达式:字符串下标超出范围。”

当我的 if 语句尝试检查字符串中“i”处的字符是否为 isDelimiter() 或 isOperator() 时,这发生在我的 for 循环中。我将 char 'check' 作为属性传递,并且在 cmets 中,我确保 '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;
    }

感谢任何帮助!

编辑::

在再次查看我的代码之后,我意识到了错误,但我还有另一个错误。该运行时错误是因为在我的 isOperator() 和 isDelimiter() 函数中,我正在检查 inputString[c] 而不仅仅是“c”。愚蠢的错误,我知道。然而,虽然不再有错误,但程序仍然跳过检查 isOperator() 和 isDelimiter() 方法,仅在读取到“”时进入 else 语句。为什么它没有进入我的 else 语句中用于运算符和分隔符?

【问题讨论】:

    标签: c++ string methods char subscript


    【解决方案1】:

    我想通了,尽管它们是简单的错误,但也许它会在未来对某人有所帮助。毕竟,我被难住了一段时间。

    它们主要只是语法错误,我真的需要更新我的编码。

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

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

    这就是我现在称呼他们的方式。我试图检查输入本身是否等于函数,这就像询问“helloworld”是否 == TRUE。显然那是行不通的,一旦我弄清楚了,我想踢自己。这是sn-p:

                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
    

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

    【讨论】:

      【解决方案2】:

      您的函数采用char,将它们更改为int

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

      【讨论】:

      • 在更改函数和传递给整数的属性后,我没有错误,但我的代码仍然跳过了应该在第一个“;”后立即输入的 else 语句被读取。最初我也将属性作为字符传递给函数,因为它们是需要在函数中检查的内容('+'、'%' 等),对吗?用 int 怎么办?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-31
      • 2013-04-22
      • 2012-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多