2016-01-21 33 views
-1

我已搜索過類似的錯誤,但找不到與我的代碼相關的答案。 我有一個登錄系統,其中名稱和密碼從文件讀入矢量。 然後我通過向量和匹配用戶名和密碼進行計數,並且我可以使用矢量中保存的任何名稱/密碼組合登錄到我的程序中,但是,如果要輸入不在矢量或文件中的東西對於這個問題它會拋出一個運行時錯誤,該向量超出範圍。 請任何人都可以幫助我如何捕捉矢量以外的用戶輸入。我希望這是有道理的。提前致謝,讓我們看看這次我能得到多少票。大聲笑。登錄時向量下標超出範圍

對不起,我沒有發佈任何代碼,我在我的桌面上發佈了問題,代碼在我的筆記本電腦上。謝謝。

void loginScreen() 
{ 
    vector <string> MyVec; 
    string unTemp; 
    string pwTemp; 
    bool correct = true; 


    cout << "Enter Your Username: "; 
    cin >> unTemp; cout << endl; 
    cout << "Enter Your Password: "; 
    cin >> pwTemp; 

    fstream admin("admin.txt", ios::in || ios::out || ios::app); 


    while (admin >> userName >> password) 
    { 
     MyVec.push_back(userName + " " + password); 
    } 

    admin.close(); 



    for (vector<string>::const_iterator i = MyVec.begin(); i != MyVec.end(); ++i) 

    { 
     for (int j = 0; j <= MyVec.size(); ++j) 


     do{ 


     if (MyVec[j] == unTemp + " " + pwTemp) 
      { 
       cout << MyVec.size() << endl; 
       cout << MyVec[j] << endl; 
       correct; 

       mainMenu(); 

      } 



      else 
      { 
       !correct; 

      } 


     } while (!correct); 

    } 

    } 
+2

您將需要顯示一些代碼和錯誤消息才能獲得幫助。請閱讀[MCVE](http://stackoverflow.com/help/mcve) – user463035818

+3

沒有代碼?讓我去拿我的水晶球... – Borgleader

+0

我的調試器已經被修復了。你可以使用一個調試器,單步執行代碼,*觀察變量?通過這種方式,下標值和向量中的項目數量一樣是已知的。 –

回答

1

你的問題是

 for (int j = 0; j <= MyVec.size(); ++j) 

應該

 for (int j = 0; j < MyVec.size(); ++j) 

使用 '< =' 來結束一個循環是一個巨大的紅旗。幾乎所有循環都從0開始,並由< limit終止。

鑑於你永遠只能用j索引到MyVec它甚至會更好,使用範圍爲基礎的類似循環:

 for (const auto &c : MyVec) 

而且,當你說

  correct; 
     .... 
     !correct 

這只是意思是「評估correct的當前值並將結果扔掉」。我認爲你的意思是

  correct = true; 
     .... 
     correct = false; 

......它實際上改變了價值!

+0

謝謝Martin,但是從我的for循環中發出my =只允許我讀取矢量的[0],如果我在[1]或[2]矢量中使用用戶名和密碼,則不會向前進展。還使用自動,然後導致我的'如果'的聲明質疑[j] ?? – james

+0

確定這很好,通過在for循環中刪除=來讓它工作得更好一些,現在我不會遇到運行時錯誤,但是當我輸入不存在的密碼/用戶名時,控制檯就會保持原樣。現在,我會在這個問題上工作一段時間,然後再請求任何幫助。再次感謝。 – james

+0

哦對。抱歉。通過自動循環,你不會說'MyVec [j]',你只是說'c'。祝你好運! –