C++ 替换std::字符串
我的字符串是C++ 替换std::字符串,c++,string,C++,String,我的字符串是std::string str(“DDWD”) 我想更改对应于以下内容的 D = [0-9] W = [a-z] 所以…(“[0-9][0-9][A-Z][0-9]” replace方法似乎无法实现这一点,因此我尝试了以下方法 string tmp = "DDDWD"; int len = 0; len = tmp.length(); for( int i = 0; i < len; i++ ) { if ( tmp[i] == 'D') {
std::string str(“DDWD”)代码>
我想更改对应于以下内容的
D = [0-9] W = [a-z]
所以…(“[0-9][0-9][A-Z][0-9]”
replace方法似乎无法实现这一点,因此我尝试了以下方法
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;
}
}
string tmp=“DDDWD”;
int len=0;
len=tmp.length();
对于(int i=0;i
然而,试图同时更改字母D和W时出现了一个问题,并且没有正确地更改它们
有人知道如何将每个字母同时更改为上面对应的字符串吗
感谢您的帮助在我看来,您只是提前结束了您的循环
len = tmp.length();
for( int i = 0; i < len; i++ )
{
len=tmp.length();
对于(int i=0;i
…因此,您保存了要迭代的长度,即使字符串变长,您也会以旧的长度停止。在我看来,您只是提前结束了循环
len = tmp.length();
for( int i = 0; i < len; i++ )
{
len=tmp.length();
对于(int i=0;i
…因此,您可以保存长度以进行迭代,即使字符串变长,您也会停留在原来的长度。我认为如果使用单独的字符串,这会更干净:
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);
string tmp=“DDDWD”;
字符串tmp2;
对于(int i=0;i我认为如果使用单独的字符串,这会更干净:
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);
string tmp=“DDDWD”;
字符串tmp2;
对于(int i=0;i而言,replace
方法适用于位置,而不是子字符串。因此,替换将是一个两步过程:find
首先,然后用find
的结果replace
,直到find
不再找到任何内容
但是,如果您向后运行循环(从末尾开始,然后向下运行),那么您这样做的方式也会起作用.替换
方法使用的是位置,而不是子字符串。因此,替换将是一个两步过程:首先查找
,然后用查找
的结果替换
,直到查找
不再找到任何内容
但是,如果您向后运行循环(从末尾开始,然后向下运行),那么这种方法也会起作用。intmain()
{
std::string tmp=“DDDWD”;
char*tmp2=新字符(5*(strlen(tmp.c_str())+1));
coutintmain()
{
std::string tmp=“DDDWD”;
char*tmp2=新字符(5*(strlen(tmp.c_str())+1));
cout如果你买得起的话,使用Boost的库。它有很多关于字符串的有用算法。你的问题是:
// #include <boost/algorithm/string/replace.hpp>
std::string tmp = "DDDWD";
boost::replace_all( tmp, "D", "[0-9]" );
boost::replace_all( tmp, "W", "[a-z]" );
/#包括
std::string tmp=“DDDWD”;
boost::替换_all(tmp,“D”和“[0-9]”);
boost::全部替换(tmp,“W”和“[a-z]”);
如果您负担得起,请使用Boost的库。它有许多关于字符串的有用算法。您的问题将是:
// #include <boost/algorithm/string/replace.hpp>
std::string tmp = "DDDWD";
boost::replace_all( tmp, "D", "[0-9]" );
boost::replace_all( tmp, "W", "[a-z]" );
/#包括
std::string tmp=“DDDWD”;
boost::替换_all(tmp,“D”和“[0-9]”);
boost::全部替换(tmp,“W”和“[a-z]”);
什么是“问题”?您实际得到的输出是什么?当您在调试器中逐步执行此操作时,您观察到了什么?请参见此“问题”是什么?您实际得到的输出是什么?当您在调试器中执行此操作时,您观察到了什么?看到了吗?如果您从一开始就空终止tmp2,您可以每次都使用strcat。那么您不需要额外的逻辑来检查i==0
或i!=0
@和rzej我尝试实现了您提到的boost,但是我得到一个错误,说它不能像你提到的那样包含replace.hpp文件。它在标准C++中不可用吗?如果你从一开始就用null终止tmp2,你可以每次都使用strcat。那么你就不需要额外的逻辑来检查i==0
或i!=0
@我试着实现你提到的boost但我有一个错误,它不能包含RESULT.HPP文件,正如你提到的。它在标准C++中是不可用的吗?