替换std :: strings

时间:2012-01-07 16:28:59

标签: c++ string

我的字符串是std::string str ("DDWD");

我想更改对应的以下内容

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

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

替换方法似乎并不适用于此,所以我尝试了类似

的方法
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时出现了问题并且它们正在彻底改变它们吗?

有没有人知道如何将每个字母同时更改为上面的相应字符串?

感谢任何帮助

5 个答案:

答案 0 :(得分:3)

在我看来,你只是提前结束循环。

len = tmp.length();

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

{

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

答案 1 :(得分: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);

答案 2 :(得分:1)

replace方法适用于位置,而不是子串。因此,替换将分为两个步骤:首先find,然后replace,结果为find,直到find找不到任何内容。

但是如果你向后运行循环(从最后开始向下工作),你的方式也可以。

答案 3 :(得分: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]" );

答案 4 :(得分:-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();   
}
相关问题