Замена std :: strings - PullRequest
       1

Замена std :: strings

1 голос
/ 07 января 2012

Моя строка 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 ]

3 голосов
/ 07 января 2012

Похоже, вы рано заканчиваете цикл.

len = tmp.length();

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

{

... поэтому вы сохраняете длину для повторения, и даже если строка становится длиннее, вы остановитесь настарая длина.

2 голосов
/ 07 января 2012

Я думаю, что было бы чище, если бы вы использовали отдельную строку:

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);
1 голос
/ 07 января 2012

Метод replace работает с позициями, а не с подстрокой.Таким образом, замена будет двухэтапной: сначала find, затем replace с результатами find, пока find больше ничего не найдет.

Но то, как вы это делаете, такжеработает, если вы запускаете цикл в обратном направлении (начинайте с конца и двигайтесь вниз).

0 голосов
/ 08 января 2012

Если вы можете себе это позволить, используйте библиотеку Boost's 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]" );
0 голосов
/ 07 января 2012
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();   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...