2016-09-18 78 views
-4

我寫了一個小程序,它將輸入存儲在向量中作爲字符串。C++中循環向量導致無效迭代

循環遍歷向量導致在實際輸出之前打印出許多空字符串。 我已經複製下面的示例行。

int main(){ 
int totalStrings; 
    string inputs; 
    vector<string> testCases(totalStrings); 
    cin>>totalStrings; 
    while(cin>>inputs) 
     testCases.push_back(inputs); 
    for(vector<string>::iterator it=testCases.begin();it!=testCases.end();++it) 
    printCustom(*it); 
    return 0; 
} 

我試着在printCustom函數中打印字符串的大小。我有幾百個零的實際輸入

+0

你能告訴我們printCustom'的'的內容? –

+2

停止猜測你使用的是什麼並閱讀文檔,然後將該代碼解釋給你的橡皮鴨。 –

+1

另外,打開更多的編譯器警告。 –

回答

2
vector<string> testCases(totalStrings); 

這行代碼有兩個問題:

  1. totalStrings是未初始化,因此垃圾,
  2. vector(N)創建vector大小Ñ缺省初始化元素,雖然你已經在向量上調用resize而不是reserve

你想要的是什麼:

std::cin >> totalStrings; 
std::vector<std::string> testCases; 
testCases.reserve(totalStrings); 
+0

謝謝。我只是沒有意識到我正在分配一個垃圾值。我的錯。感謝您指出。 – user3488285

-1

嘗試以下操作前打印:

cin>>totalStrings; 
vector<string> testCases(totalStrings); 

你已經初始化totalStrings(如INT)沒有一個適當的值,你用它來初始化向量。這是不好的時候!

此外,請檢查您的縮進(非常好的做法)。

一切順利。

爲了解釋進一步(請檢查代碼,如果需要的話):

在代碼中,你寫道:

int totalStrings; 
string inputs; 
vector<string> testCases(totalStrings); 

點1: 在第一行,你有沒有初始化totalStrings到任何東西。在這種情況下,取決於計算機,矢量可以初始化爲任意可能的長度。在我的電腦,如果我做到以下幾點:

int totalStrings; 
cout << totalStrings; // printing un-initialized totalStrings 
string inputs; 
vector<string> testCases(totalStrings); 

的代碼打印零,這意味着totalStrings,通過魔法,初始化爲零。但是你的系統可能會也可能不會這樣。

點2: 現在,當您初始化一個預定義大小的向量時,您已經爲值提供了空間,但默認情況下沒有值。而且,由於您使用的是push_back方法,因此您正在放大矢量並將其添加到矢量的末尾。

最終輸出中的點1和點2的含義; 因此,當您打印時(使用for循環和迭代器),您將獲得與初始長度(由totalStrings和向量初始化定義)一樣多的零;打印完初始矢量後,它將打印您手動輸入的字符串。

請使用下面的代碼來獲得一種感覺。我希望這有幫助。

#include <string> 
#include <vector> 
#include <iostream> 

using namespace std; 

int main() { 

    int totalStrings; 
    cout << "Please enter initial vector length: "; 
    cin >> totalStrings; 

    vector<string > testCases(totalStrings); 

    string inputs; 
    cout << "Enter the strings into the vector [Enter -1 to finish]: "; 

    while(true) { 
     cin >> inputs; 
     if (inputs == "-1") { break; } 
     testCases.push_back(inputs); 
     cout << "Next? "; 
    } 

    for (vector<string>::iterator it = testCases.begin(); it != testCases.end(); ++it) 
     cout << ' ' << it->size(); 

    return 0; 
} 
+5

如果您不確定,請在發帖之前測試您的答案,這是錯誤的(或者*非常*不完整)。 –

+0

我已經做了詳細的更改。 – Ehsan

+0

這仍然不能產生所需的輸出,但是您解釋了OP需要知道的解決方法。 Downvote刪除。 –