Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 替换std::字符串_C++_String - Fatal编程技术网

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));
cout
intmain()
{
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++中是不可用的吗?