【问题标题】:Replacing std::strings替换 std::strings
【发布时间】:2012-01-07 16:28:58
【问题描述】:

我的字符串是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 时出现问题,并且无法正确更改它们?

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

感谢您的帮助

【问题讨论】:

  • 什么是“问题”?你实际得到的输出是什么?当您在调试器中单步执行此操作时,您观察到了什么?
  • 看到这个link

标签: c++ string


【解决方案1】:

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

len = tmp.length();

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

{

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

【讨论】:

    【解决方案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);
    

    【讨论】:

      【解决方案3】:

      replace 方法适用于位置,而不是子字符串。所以替换将是一个两步过程:首先是find,然后是replace,结果是find,直到find 不再找到任何东西。

      但是,如果您向后运行循环(从末尾开始并向下运行),您执行此操作的方式也有效。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:
          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();   
          }
          

          【讨论】:

          • 如果你从一开始就对 tmp2 进行空终止,你可以每次都使用 strcat。那么你就不需要检查i==0i!=0的额外逻辑
          • @Andrzej 我尝试实现你提到的 boost 东西,但我收到一个错误,说它不能像你提到的那样包含 replace.hpp 文件。它在标准 C++ 中不可用吗
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-04
          相关资源
          最近更新 更多