更换的std ::字符串

问题描述:

我的字符串为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://*.com/questions/1494399/how-do-i-search-find-and-replace-in-a-standard-string) – sivakg2000 2012-01-07 16:40:08

我认为,如果你使用一个单独的字符串,这将是清洁:

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); 

看起来像你刚刚结束你的循环早。

len = tmp.length(); 

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

{ 

...所以你保存要迭代的长度,即使字符串变长,你也会停在旧的长度。

replace方法适用于位置,而不是子。因此,替换将是一个两步的过程:find第一,然后replacefind的结果,直到find不再发现任何东西。

但是你这样做的方式也适用,如果你向后运行循环(从头开始,然后按照你的方式)。

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

如果您负担得起,请使用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]");