Alternativen zur replace Funktion



  • Combum schrieb:

    /* ... */
    

    face->hit( desk );

    #include <cctype>
    #include <chrono>
    #include <random>
    #include <array>
    #include <string>
    #include <iostream>
    
    int main()
    {
    	std::mt19937 engine{ static_cast< long unsigned >(
    		std::chrono::high_resolution_clock::now().time_since_epoch().count() ) };
    
    	std::array< char, 'z' - 'a' + 'Z' - 'A' + 2 > alphabet;	
    	for( std::size_t i{}; i < alphabet.size(); ++i )  // <<-- volkard-Gedaechtnis-Zeile.
    		alphabet[ i ] = ( i > 'z' - 'a' ? 'A' : 'a' ) + i % ( 'z' - 'a' + 1 );
    
    	std::shuffle( alphabet.begin(), alphabet.end(), engine );
    
    	std::string input;
    	std::cin >> input;
    
    	for( auto & ch : input )
    		if( std::isalpha( ch ) )
    			ch = alphabet[ ( std::islower( ch ) ? ch - 'a' : 'z' - 'a' + ch - 'A' + 1 ) ];
    
    	std::cout << input << '\n';
    }
    


  • Kein Grund, Loops zu verwenden!

    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <random>
    #include <boost/range/irange.hpp>
    #include <boost/range/algorithm.hpp>
    #include <boost/range/join.hpp>
    #include <array>
    
    int main() {  
      std::array<char, 2*('z'-'a'+1)> from, to;
      boost::copy(boost::join(boost::irange('a', static_cast<char>('z'+1)), 
                              boost::irange('A', static_cast<char>('Z'+1))), from.begin());
      to = from;
      std::shuffle(begin(to), end(to), std::mt19937(std::random_device()()));
      std::transform(std::istreambuf_iterator<char>(std::cin), {},
                     std::ostreambuf_iterator<char>(std::cout),
                     [&](char c) { auto i = std::find(from.begin(), from.end(), c);
                                   return i==from.end() ? c : to[i-from.begin()]; });
    }
    


  • Kann mir denn mal jemand erklären wo ich den Fehler gemacht habe?
    Irgendwie sollte mir dieser Fehler peinlich sein, oder? 😕

    Ps: Solche krassen Algorithmen von Swordfish verstehe ich (noch) nicht.



  • volkard schrieb:

    Mach den Schreibtischtest.

    Schon versucht?



  • Ich wüsste nicht wie ich den machen sollte.
    Der Code ist ja ziemlich unkompliziert.
    Sind ja noch nicht einmal Zahlen dabei.

    Ich könnte mir aber vorstellen, dass bei dem Array was falsch ist? 😕



  • Combum schrieb:

    Ich wüsste nicht wie ich den machen sollte.

    Du sollst deinen Code mit einer Plausiblen eingabe mit Bleistift auf Papier durchgehen und dir ansehen, was Schritt für Schritt mit der Eingabe passiert.



  • ICH HABS!

    Wenn z.B. aus einem a ein C gemacht wurde wird später aus einem großen C wieder etwas anderes!

    Ab heute werde ich diesen neuartigen "Schreibtischtest" weiterempfehlen! 👍 😃

    Nächste Frage: Wie kann ich das am besten vermeiden?

    Noch eine Frage: Ich habe erst letztens bemerkt, dass cin nur bis zu einem Leerzeichen einliest, welche eingabemethode wäre am besten für einen kompletten text mit zeilenumbruch und allem?



  • iocc schrieb:

    Kein Grund, Loops zu verwenden!

    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <random>
    #include <boost/range/irange.hpp>
    #include <boost/range/algorithm.hpp>
    #include <boost/range/join.hpp>
    #include <array>
    
    int main() {  
      std::array<char, 2*('z'-'a'+1)> from, to;
      boost::copy(boost::join(boost::irange('a', static_cast<char>('z'+1)), 
                              boost::irange('A', static_cast<char>('Z'+1))), from.begin());
      to = from;
      std::shuffle(begin(to), end(to), std::mt19937(std::random_device()()));
      std::transform(std::istreambuf_iterator<char>(std::cin), {},
                     std::ostreambuf_iterator<char>(std::cout),
                     [&](char c) { auto i = std::find(from.begin(), from.end(), c);
                                   return i==from.end() ? c : to[i-from.begin()]; });
    }
    

    🤡



  • Tut mir leid Ethon ich verstehe den QC nicht. kannst du eventuell auskommentieren,
    und mir die Zeilen angeben, die ich brauche, damit der Fehler nicht passiert? Außerdem bitte noch sagen an welche Stelle das gehört. Danke! 🙄



  • Combum schrieb:

    Nächste Frage: Wie kann ich das am besten vermeiden?

    Deine ganze Herangehensweise ist daneben. Dafür braucht man keine Regular Expressions ...

    Vorschlag:

    • Alphabet ( 'a' - 'z' , 'A' - 'Z' ) in ein Array alphabet schreiben

    • alphabet kräftig durchmischen

    • Benutzereingabe nach input lesen

    • Für jedes Zeichen in input

    • Position des Zeichens in einem nicht durchgewürfelten alphabet berechnen

    • Zeichen mit dem Zeichen an berechneter Position von alphabet ersetzen

    • input ausgeben

    Combum schrieb:

    Noch eine Frage: Ich habe erst letztens bemerkt, dass cin nur bis zu einem Leerzeichen einliest, welche eingabemethode wäre am besten für einen kompletten text mit zeilenumbruch und allem?

    std::getline() ließt eine Zeile (bis '\n' ).



  • Da es noch nicht explizit erwähnt wurde: Sobald du alle Buchstaben einzeln in den Code schreibst, und sogar noch Gross-/Kleinschreibung und 2 nacheinander als Varianten, hast du etwas Grundlegendes im Programmieren nicht verstanden. Nämlich Codeduplikation zu vermeiden, indem man ähnlich aussehende Codestücke durch Abstraktion (Funktionen, Schleifen, ...) vereinheitlicht.



  • Bumbum schrieb:

    Da es noch nicht explizit erwähnt wurde: Sobald du alle Buchstaben einzeln in den Code schreibst, und sogar noch Gross-/Kleinschreibung und 2 nacheinander als Varianten, hast du etwas Grundlegendes im Programmieren nicht verstanden. Nämlich Codeduplikation zu vermeiden, indem man ähnlich aussehende Codestücke durch Abstraktion (Funktionen, Schleifen, ...) vereinheitlicht.

    Ich wusste nicht, dass man einfach "A" - "Z" machen kann.



  • Combum schrieb:

    Ich wusste nicht, dass man einfach "A" - "Z" machen kann.

    Kann man. Aber kennst du den Unterschied zwischen einzelnen Zeichen und Strings?



  • Klar, einzelne Zeichen werden in char definiert, texte in strings, ürsprünglich war es aber gedacht, mehrere zeichen zu verwenden, ich werde es aber ausbessern.

    Ich weiß dass man mit getline(); bis zum Zeilenende lesen kann, ich möchte aber ALLES. 😃

    und wie sollte ich deiner Meinung nach die Zeichen suchen und ersetzen?
    (bitte so einfach wie möglich)



  • Combum schrieb:

    Ich wusste nicht, dass man einfach "A" - "Z" machen kann.

    Swordfish schrieb:

    Kann man. Aber kennst du den Unterschied zwischen einzelnen Zeichen und Strings?

    Klar, [...]

    Dann ist dir auch klar, daß "a" - "z" etwas anderes ist als 'a' - 'z' ? Btw. was kommt deiner Meinung nach dabei überhaupt heraus?

    Combum schrieb:

    Ich weiß dass man mit getline(); bis zum Zeilenende lesen kann, ich möchte aber ALLES.

    Dann eben ein paar mal std::getline() ?

    Combum schrieb:

    und wie sollte ich deiner Meinung nach die Zeichen suchen und ersetzen?

    Du brauchst nichts suchen, bloß im Alphabet nachschlagen.



  • Swordfish schrieb:

    Combum schrieb:

    und wie sollte ich deiner Meinung nach die Zeichen suchen und ersetzen?

    Du brauchst nichts suchen, bloß im Alphabet nachschlagen.

    Aber wie soll ich nachschlagen? Kannst du mir Funktionen nennen welche ich am besten benutzen sollte?

    Den Unterschied zwischen " und ' kenne ich nicht, wäre nett wenn du mir den erläutern könntest.

    Gute Nacht bis morgen und Danke, dass du mir bei meinem Lernprozess (wenn man es so nennen kann) hilfst. 😃



  • Combum schrieb:

    Den Unterschied zwischen " und ' kenne ich nicht, wäre nett wenn du mir den erläutern könntest.

    'A' ist ein Zeichen, hat den Typ char und entspricht einem Zahlenwert.
    "A" ist eine Zeichenkette bestehend aus den Zeichen { 'A', '\0' } und ist vom Typ char const [2] .

    Combum schrieb:

    Gute Nacht bis morgen und Danke, dass du mir bei meinem Lernprozess (wenn man es so nennen kann) hilfst. 😃

    Ne du, dir fehlen absolute Grundlagen, die du dir am besten durch das Studium eines Lehrbuches aneignest.


  • Mod

    Nein, vom Typ char const [2] .



  • Stimmt. Korrigiert.



  • Gebt ihm mal ne vernünftige Antwort sonst fang ich an sie auf dem Handy zu tippen.
    Lese hier nur Klugscheißerei und anfängerfeindliche Lösungen die die halbe stdlib nutzen.


Anmelden zum Antworten