(對不起,如果我的保證金充滿mystakes,我會盡我所能寫一些可讀的)嗨,我正在研究一個函數讀取文件和存儲每一行的第一行char是「:」並刪除字符串中包含的每個短劃線。每次找到這種類型的行時,push_back()都被用來將這一行存儲在向量中。問題是,每次使用push_back()時,向量中的所有元素都取最後一個元素的值。我不明白爲什麼會發生。下面的代碼:std :: vector做奇怪的事情
string listContent;
size_t dashPos;
vector<char*>cTagsList;
while(!SFHlist.eof())
{
getline(SFHlist,listContent);
if(listContent[0]==':')
{
listContent.erase(0,1);
dashPos = listContent.rfind("-",string::npos);
while(dashPos!=string::npos)
{
listContent.pop_back();
dashPos = listContent.rfind("-",string::npos);
}
char* c_listContent = (char*)listContent.c_str();
cTagsList.push_back(c_listContent);
}
}
我開始還以爲是與該文件的末尾,但中止搜索過程之前達到這一點給出了相同的結果有問題。
首先,['而(!EOF())'是錯誤的。(http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong)第二,將'c_str'的結果轉換爲'char *'非常糟糕。第三,只要修改字符串,該指針就無效,該字符串恰好在後面發生。使用'std :: string'的向量。無論如何,你並沒有消除每一次衝刺,你會在第一次衝刺之後消除所有事情。使用'std :: remove'並將其與'erase'配對。 – chris
請不要*存儲'c_str'的結果!相反,只需要使用char *只有在處理純c的時候,你在C++ – crashmstr
char *,使用std :: string,你不必考慮太多 – blade