Iteratory stringów+ cctype

0

Cześć. Kolejny dzień zmagań ze iteratorami stringów i kolejny problem.
Funkcja wstawia pojedynczą spacje między każdą cyfrę a przylegający do niej znak (nie cyfra).
Już robiłem to bez cctype, ale ma to być jako uniwersalna funkcja z użyciem tej biblioteki.
Myślę, że trzeba użyć** isdigit** oraz** isaplha**. Czytałem o nich i nie wiem jak to przekonwertować (?).
Oczywiście mogę tylko korzystać ze biblioteki string i cctype.
Czy jest jakiś sposób, żeby char, który definiuję przyjmował wartość stringa, który jest dany w zadaniu? // pytanie nieważne
Dana: "peppermint1001bubbles balloon gum"
Odp: "peppermint 1001 bubbles balloon ngum"

std::string::iterator function (std::string::const_iterator begin, std::string::const_iterator end, std::string::iterator begin2)
1

Czy jest jakiś sposób, żeby char, który definiuję przyjmował wartość stringa, który jest dany w zadaniu?

Nie rozumiem.

Ogólnie polega na wstawieniu spacji tam gdzie alpha != digit dla obu sąsiednich znaków.

1

Co już masz zrobione i co ci nie działa?
Jakie masz "ważne" pytanie?

0

Wskazówki, uwagi, komentarze?

std::string::iterator function (std::string::const_iterator begin, std::string::const_iterator end, std::string::iterator begin2) {
	while (begin != end) {
		if (*begin == isalpha(*begin)){ 
			if(*(begin+1) == isdigit(*(begin+1))){ 
				*begin2++ = ' ';
			}
			else {
				++begin;
			}
		}
		else if ( *begin == isdigit(*begin)){ 
			if(*(begin+1) == isalpha(*(begin+1))){ 
				*begin2++ = ' ';
			}
			else {
				++begin;
			}
		}
		else {
			*begin2++ = *begin++;
		}
	}
	return begin2;										
}
1

ten warunek *begin == isalpha(*begin) jeśli ci działa to fuksem. Nie jest powiedziane jaką wartość zwraca isalpha dla liter, wiadomo jedynie, że nie zero.
https://en.cppreference.com/w/cpp/string/byte/isalpha

2

@{adgjmptw's world}: Chyba znowu przekombinowałeś ;)

while (begin != end) {
  *dest++ = *begin;
  if ( /* warunki do spełnienia */ )
    *dest++ = ' ';
  ++begin;
}
3
    assert( begin != end );
    while( begin != (end-1) )
    {
        if( ( isalpha(*begin) && isdigit(*(begin+1)) ) || ( isdigit(*begin) && isalpha(*(begin+1)) ) )
        {
            *begin2++ = *begin++;  *begin2++ = ' ';
        }
        else *begin2++ = *begin++;
    }
    *begin2++ = *begin;

Tylko musisz zdawać sobie sprawę, że tak zaprojektowana funkcja może się stać koszmarem dla programisty. Wystarczy

    string test {"7abc3abc8A8BBA8AA"};
    string output;
    output.resize(test.size());
    function( test.cbegin() , test.cend() , output.begin() );

i mamy piękne UB, gdyż function zakłada w sposób** nie jawny**, że dostarczony do niej string ma już odpowiedni rozmiar.

1 użytkowników online, w tym zalogowanych: 0, gości: 1