2015-04-05 68 views
0

下面的代碼片段打印單詞的第一個字母而不是整個單詞。但是當我調試它時,我會看到包含整個單詞的數據數組。誰能解釋爲什麼。cout錯誤地打印出字符串的矢量

vector<string> data; 
vector.resize(x); 
for(int i=0; i<x; i++) 
{ 
    infile.getline(&data[i][0],32,'\n'); 
    cout<<data[i]; 
    if(infile.fail()) break; 
} 
+0

'infile.getline(&data [i] [0],32,'\ n');'這表現出未定義的行爲。你承諾'getline'指出'&data [i] [0]'指向一個至少有32個字節的緩衝區 - 但事實並非如此。 'data [i]'是一個空字符串。 – 2015-04-05 01:58:59

+0

我不太明白你在說什麼。你能給出一個它應該如何的代碼示例嗎? – user3651245 2015-04-05 02:24:11

回答

0

您超出了字符串的範圍。 data[i]是一個空字符串,寫入&data[i][0]會導致未定義的行爲。

的代碼可以被替代:

for (int i = 0; i < x; i++) 
{ 
    if (!getline(infile, data[i])) 
     break; 

    if (data[i].size() > 32) 
     data[i].resize(32); 

    cout << data[i]; 
} 

注意,這也可修復您輸入失敗之後再做cout << data[i];錯誤。

+0

'writing&data [i] [0]會導致未定義的行爲。「不正確 - 寫入本身不會導致未定義的行爲。 s [s.size()]'是明確定義的。修改'[size()]'是導致未定義行爲的原因。 – 2015-04-05 02:04:11

+0

@Matt但是我想限制它爲32個字符,這就是爲什麼我想使用fstream_object.getline() – user3651245 2015-04-05 02:21:37

+0

@ user3651245當線長度大於32時你想要發生什麼?丟棄剩下的部分,或者在下一次閱讀中讀取它? – 2015-04-05 02:58:15