2012-03-05 60 views
1

我有一個問題,使用字符串函數erase與迭代器。string :: erase不需要迭代器?

下面的函數取得輸入文件和.ini文件的名稱並創建輸出文件的路徑。該路徑被定義爲

dir + in_file + def_name + ini_file + ".txt" 

我使用erase刪除輸入文件名的擴展名。

void Output::vDefault(string in, string ini) 
{ 
//save names 
strIn=in; 
strIni=ini; 

//get working dir 
char mydirectory[MAX_PATH] = {""}; 
GetCurrentDirectory(MAX_PATH,mydirectory); 

//erase extensions 
strIn.erase(strIn.find_last_of('.'), strIn.end()); // error 
strIni.erase(strIni.find_last_of('.'), strIni.end()); // error 

//adr starts with folder 
strAdr=mydirectory; 
//and ends with name 
//address=dir+in_file+def_name+ini_file+.txt; 
strAdr+=strIn+DEFOUTNAME+strIni+".txt";  
} 

運行的代碼將導致以下錯誤:

error C2664: 'std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::erase(unsigned int,unsigned int)' : cannot convert parameter 2 from 'std::_String_iterator<_Elem,_Traits,_Alloc>' to 'unsigned int' 

erase可以採取兩個迭代器作爲第一個和最後一個。你可以幫我嗎?我不知道爲什麼它不接受我的項目中的任何內容,但int

+1

另外:你不需要「保存名字」,你可以通過值*傳遞字符串*。 – Johnsyweb 2012-03-05 08:39:59

回答

0

string::find_last_of()不返回迭代器,所以它不能匹配string::erase()的迭代器超載。

幸運的是,string::erase()重載需要的位置默認的索引來擦除從有到年底,所以下面應該爲你工作:

strIn.erase(strIn.find_last_of('.')); 
strIni.erase(strIni.find_last_of('.')); 

當然,串最好實際上有一個'.'中的字符...

+0

我檢查'。'之前。我將使用strIn.erase(strIn.find_last_of('。')); thx – Eskalante 2012-03-05 09:25:53

+0

如果沒有找到字符串,則會返回'string :: npos',這是'end()'的等價物,所以這不成問題。 – Xeo 2012-03-07 15:26:29

1

發生錯誤是因爲擦除簽名需要2個size_t或2個迭代器。不是一個組合。 find_last_of返回一個爲size_t

http://www.cplusplus.com/reference/string/string/erase/

string& erase (size_t pos = 0, size_t n = npos); 
iterator erase (iterator position); 
iterator erase (iterator first, iterator last); 

http://www.cplusplus.com/reference/string/string/find_last_of/

size_t find_last_of (const string& str, size_t pos = npos) const; 
size_t find_last_of (const char* s, size_t pos, size_t n) const; 
size_t find_last_of (const char* s, size_t pos = npos) const; 
size_t find_last_of (char c, size_t pos = npos) const; 

的解決方案是使用

string& erase (size_t pos = 0, size_t n = npos); 

這裏是爲size_t n可選用。

擦除從位置pos開始的n個字符序列。注意 這兩個參數都是可選的:只有一個參數, 函數刪除位置pos前向的所有內容,並且沒有參數 ,該函數將刪除整個字符串,如成員清除。

strIn.erase(strIn.find_last_of('.')); 
strIni.erase(strIni.find_last_of('.')); 
+0

它工作,如果我這樣使用它:size_t tmp = strIni.find_last_of('。'); \t strIni。擦除(tmp,string :: npos); thx – Eskalante 2012-03-05 09:14:11

+0

你可以省略'string :: npos',只是'strIn.erase(strIn.find_last_of('。'));' – RvdK 2012-03-05 09:33:51

相關問題