Iteratory stringów - zamiana sekwencji

0

Cześć.
Dostałem zadanie, w którym trzeba zamienić sekwencję \r\n na** \n** i odwrotnie. Mogę korzystać jedynie z #include <string>.
Nie wiem gdzie leży błąd, kombinowałem na wszelkie sposoby i niestety nic nie udało mi się wymyśleć.
Czy ostatni else if jest dobrze zapisany? Czy może on wymaga rozbicia r i **n **za pomocą &&.
Czy nie powinienem zapisywać *target++ na dwie linijki? np. ' \\ ' i ' r '
Z góry dziękuje za każdą wskazówkę :)

string do zadania : "peppermint 1001\rbubbles\nballoon\r\ngum"
prawidłowa odpowiedź:** "peppermint 1001\rbubbles\r\nballoon\ngum"**

std::string::iterator function(std::string::const_iterator begin, std::string::const_iterator end, std::string::iterator target) {

	while (begin < end) { 
		if (*begin == '\r') {
			*target++ = '\r';
			begin++;
		}
		else if (*begin == '\n') {
			*target++ = '\r';
			*target++ = '\n';
			begin++;
		}
		else if (*begin == '\r\n') {
			*target++ = '\n';
			begin ++;
		}
		else {
			*target++ = *begin++;
		}
	}
	return target;
}
0
#include <iostream>

using namespace std;

string raw( char c )
{
    switch( c )
    {
        case '\n': return "\\n";
        case '\r': return "\\r";
        default  : return string{c};
    }
}

string change( const string& target )
{
    string result {};

    for( auto iter {target.cbegin()} ; iter!=target.cend() ; ++iter )
    {
        if( *iter == '\n' )
        {
            if( iter != target.cbegin() && *(iter-1) == '\r' )
            {
                result += raw('\n');
            }
            else
            {
                result += raw('\r')+raw('\n');
            }
        }
        else if( ! ( ( (iter+1) != target.cend() ) && ( *iter == '\r' && *(iter+1) == '\n' ) ) ) result += raw(*iter);
    }

    return result;
}

int main()
{
   cout << R"(peppermint 1001\rbubbles\nballoon\r\ngum)" << " - > " << change("peppermint 1001\rbubbles\nballoon\r\ngum") << "\n";
   return 0;
}

1

Problem polega na tym, że \r\n to nie jeden znak, a dwa.

0
template<typename In, typename Out>
Out convert_win_to_unix_line_endings(In b, In e, Out r)
{
     while (b != e) {
          while (b != e && *b != '\r')
               *r++ = *b++;
          if (b == e) break;
          ++b;
          if (b == e || *b != '\n') {
              *r++ = '\r';
          }
     }
     return r;
}
0

Moim zdaniem powinno to hulać, ale program ma nadal obiekcje co do tego. Jakieś wskazówki?

std::string::iterator function(std::string::const_iterator begin, std::string::const_iterator end, std::string::iterator target) {

	while ( begin < end ) {
		
		if ( *begin == '\r') {
			if( *(begin +1) == '\n') {
				*target++ = '\n';
				begin++;
	
			}
			else {
				*target++ ='\r';
				begin++;	
			}
		}
		else if (*begin == '\n') {
			*target++ = ('\r' + '\n');
			begin++;
		}
		else {
			*target++ = *begin++;
		}
	}
}
0

A jakaś kombinacja string::find i string::replace nie pomoże?

2

A takie cuś nie styknie?

string::iterator convert(string::const_iterator begin, string::const_iterator end, string::iterator dest)
{
    while (begin != end) {
        if (*begin == '\n') {
            *dest++ = '\r';
        }
        else if (*begin == '\r' && (begin+1) != end && *(begin+1) == '\n') {
            ++begin;
        }
        *dest++ = *begin++;
    }
    return dest;
}

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