2012-01-07 54 views
1

我的字符串爲std::string str ("DDWD");更換的std ::字符串

我想改變符合下列

D = [0-9] W = [a-z] 

洙... ("[0-9][0-9][A-Z][0-9]")

替換法似乎並不accomade此,所以我嘗試了類似於

string tmp = "DDDWD"; 
int len = 0; 
len = tmp.length(); 
for(int i = 0; i < len; i++) 
{ 
    if (tmp[i] == 'D') 
    { 
     tmp.replace(i,1,"[0-9]"); 
     i+=2; 
    } 
} 

但試試如果要更改字母D和W都存在問題,並且無法正確更改它們?

有沒有人知道如何將每個字母同時更改爲相應的字符串?

感謝您的任何幫助

+0

什麼是「問題」?你實際得到的輸出是什麼?當你在調試器中完成這一步時,你觀察到了什麼? – 2012-01-07 16:31:25

+0

看到這個[link](http://stackoverflow.com/questions/1494399/how-do-i-search-find-and-replace-in-a-standard-string) – sivakg2000 2012-01-07 16:40:08

回答

2

我認爲,如果你使用一個單獨的字符串,這將是清潔:

string tmp = "DDDWD"; 
string tmp2; 

for (int i=0; i<tmp.size(); ++i) 
{ 
    if (tmp[i] == 'D') 
     tmp2 += "[0-9]"; 
    else if (tmp[i] == 'W') 
     tmp2 += "[a-z]"; 
    else 
     tmp2 += tmp[i]; 
} 

tmp.swap(tmp2); 

// or in C++11 
// tmp = std::move(tmp2); 
4

看起來像你剛剛結束你的循環早。

len = tmp.length(); 

for(int i = 0; i < len; i++) 

{ 

...所以你保存要迭代的長度,即使字符串變長,你也會停在舊的長度。

1

replace方法適用於位置,而不是子。因此,替換將是一個兩步的過程:find第一,然後replacefind的結果,直到find不再發現任何東西。

但是你這樣做的方式也適用,如果你向後運行循環(從頭開始,然後按照你的方式)。

-1
int main() 
{ 
    std::string tmp = "DDDWD"; 
    char *tmp2=new char(5*(strlen(tmp.c_str()) +1)); 
    cout << "tmp is " << tmp; 


    for (int i=0; i<tmp.size(); ++i) 
    { 
    if (tmp[i] == 'D' && i==0) 
    tmp2 = strcpy(tmp2,"[0-9]"); 
    else if(tmp[i] == 'D' && i!=0) 
    tmp2 = strcat(tmp2,"[0-9]"); 
    else if (tmp[i] == 'W' && i==0) 
    tmp2 = strcpy(tmp2,"[a-z]"); 
    else if (tmp[i] == 'W' && i!=0) 
    tmp2 = strcat(tmp2,"[a-z]"); 
    } 

    cout << "tmp2 is :" << tmp2; 

    getchar(); 
} 
+1

如果你null-terminate tmp2從開始,你可以每次使用strcat。那麼你不需要額外的邏輯來檢查'i == 0'或'i!= 0' – 2012-01-07 17:24:49

+0

@BenjaminLindley謝謝 – Invictus 2012-01-08 10:09:21

+0

@Andrzej我試着實現你提到的提升事情,但我得到一個錯誤,說它不是能夠像你提到的那樣包含replace.hpp文件。它在標準C++中不可用嗎? – Invictus 2012-01-08 10:31:24

0

如果您負擔得起,請使用Boost的String Algo庫。它有很多有用的字符串算法。您的問題將讀取:

// #include <boost/algorithm/string/replace.hpp> 
    std::string tmp = "DDDWD"; 
    boost::replace_all(tmp, "D", "[0-9]"); 
    boost::replace_all(tmp, "W", "[a-z]");