2014-02-06 17 views
0

我的程序運行時出現錯誤:
「Debug Assertion Failed!... Expression:string subscript out of range。」表達式:字符串下標超出範圍。屬性傳遞問題?

當我的if語句嘗試檢查字符串'i'中的字符isDelimiter()或isOperator()時,這發生在我的for循環中。我將char'check'作爲屬性傳遞,並且在評論中我確保'check'抓住正確的字符。我一直在處理這個問題一段時間,我似乎無法解決它。

EDITED AT BOTTOM

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語句。爲什麼它不會爲我的運營商和分隔符聲明呢?

回答

1

你的函數char,他們改變int

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

在更改函數和傳遞給int的屬性之後,我沒有錯誤,但是我的代碼仍然跳過else語句,它應該在第一個';'被閱讀。 最初我還將屬性作爲字符傳遞給函數,因爲它們是函數中需要檢查的內容('+','%'等),我正確嗎?它怎麼會與int? – Dreiak

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 

這已經解決了我的基本問題,現在到更大的問題。