下面的代碼片段打印單詞的第一個字母而不是整個單詞。但是當我調試它時,我會看到包含整個單詞的數據數組。誰能解釋爲什麼。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;
}
下面的代碼片段打印單詞的第一個字母而不是整個單詞。但是當我調試它時,我會看到包含整個單詞的數據數組。誰能解釋爲什麼。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;
}
您超出了字符串的範圍。 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];
錯誤。
'writing&data [i] [0]會導致未定義的行爲。「不正確 - 寫入本身不會導致未定義的行爲。 s [s.size()]'是明確定義的。修改'[size()]'是導致未定義行爲的原因。 – 2015-04-05 02:04:11
@Matt但是我想限制它爲32個字符,這就是爲什麼我想使用fstream_object.getline() – user3651245 2015-04-05 02:21:37
@ user3651245當線長度大於32時你想要發生什麼?丟棄剩下的部分,或者在下一次閱讀中讀取它? – 2015-04-05 02:58:15
'infile.getline(&data [i] [0],32,'\ n');'這表現出未定義的行爲。你承諾'getline'指出'&data [i] [0]'指向一個至少有32個字節的緩衝區 - 但事實並非如此。 'data [i]'是一個空字符串。 – 2015-04-05 01:58:59
我不太明白你在說什麼。你能給出一個它應該如何的代碼示例嗎? – user3651245 2015-04-05 02:24:11