我的字符串是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时出现了问题并且它们正在彻底改变它们吗?
有没有人知道如何将每个字母同时更改为上面的相应字符串?
感谢任何帮助
答案 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();
}