2012-05-11 24 views
5

Jestem nowy w wyrażeniach regularnych C++ i nie mogę ich używać z ciągami znaków zamiast char *. Przykłady, które widziałem do tej pory, dotyczyły c-strun.Dlaczego kod wyrażeń regularnych C++, który działa z "cmatch" podnosi wyjątek z "smatch"?

Mój prawdziwy program, którego nawet nie będę próbował tutaj pokazywać, używa sub-dopasowań, ale nie mogłem ich wykonać, więc próbowałem zmodyfikować bardzo prosty przykład, ale to też nie działa. Używam Visual Studio 2010 Ultimate.

Oryginalny - praca - kod:

const char *first = "abcd"; 
const char *last = first + strlen(first); 
std::cmatch mr; 
std::regex rx("abc"); 
std::regex_constants::match_flag_type fl = std::regex_constants::match_default; 

std::cout << "search(f, l, \"abc\") == " << std::boolalpha 
      << regex_search(first, last, mr, rx) << std::endl; 
std::cout << " matched: \"" << mr.str() << "\"" << std::endl; 

std::cout << "search(\"xabcd\", \"abc\") == " << std::boolalpha 
      << regex_search("xabcd", mr, rx) << std::endl; 
std::cout << " matched: \"" << mr.str() << "\"" << std::endl; 

Zmodyfikowany kod:

const string first = "abcd";  // char * => string 
std::smatch mr;     // cmatch => smatch 
std::regex rx(string("abc")); 
std::regex_constants::match_flag_type fl = std::regex_constants::match_default; 

       // this works: 
std::cout << "search(f, l, \"abc\") == " << std::boolalpha 
      << regex_search(first, mr, rx) << std::endl; 
std::cout << " matched: \"" << mr.str() << "\"" << std::endl; 

       // after the next line executes mr seems good to me: 
       // mr[0] = {3, matched:true, first="abcd", second="d",...} 
std::cout << "search(\"xabcd\", \"abc\") == " << std::boolalpha 
      << regex_search(string("xabcd"), mr, rx) << std::endl; 
       // but the following line gives the error 
       // "Debug assertion failed" 
       // Expression: string iterators incompatible 
std::cout << " matched: \"" << mr.str() << "\"" << std::endl; 

Dziwne, że jedna część zmodyfikowanego kodu działa, podczas gdy następna część wywołuje wyjątek. Próbowałem nawet użyć mr [0] .str(), ale otrzymałem ten sam komunikat o błędzie. Czy możesz mi pomóc rozwiązać ten problem?

Odpowiedz

10

Problem dotyczy jednego z tymczasników.

smatch będzie zawierać iteratory w ciągu, którego szukasz.

regex_search(string("xabcd"), mr, rx) tworzy tymczasowy ciąg znaków, który umiera na ;.

W związku z tym do czasu użycia numeru mr w następnej linii odnosi się do unieważnionej pamięci. Model string powinien być dłuższy niż mr.

+0

Dziękujemy! Widzę, że tego nie przemyślałem. To również całkowicie wyjaśnia, dlaczego mój oryginalny kod ulega awarii. – afalco

Powiązane problemy