Return eines Strings und "Overflow" Error



  • Ripleys schrieb:

    @manni66 So wurde das deklarieren von Strings bei uns eingeführt.

    Nein, wurde es nicht.

    Ripleys schrieb:

    Das mit den einzelnen und doppelten anführungszeichen ist mir bewusst, ich wollte mit der forschleife auch jede stelle von Verschluesselt einzeln mit nem char belegen

    Soso

    Zusammenfassend: du hast nicht gelernt, daher nichts verstanden und versuchst jetzt mit diesem Nichtwissen ein Programm zusammnzuklöppeln. Dann fängst du am Besten mal von vorne an.



  • Huch, tatsächlich, [6] kommt ja nur bei dem deklarieren hinzu , mein fehler.
    Danke für den Hinweis! Da es immer noch nicht läuft wird das aber leider nicht der letzte Fehler gewesen sein .. 😃



  • dein korrigiertes programm ist ja auch genauso scheiße, wie das vorherige.

    also:

    //String erstellen
    string str;
    
    //Array aus Strings erstellen (hier 5 Stück), die von 0 - 4 angesprochen werden können
    string str[5];
    


  • HansKlaus schrieb:

    dein korrigiertes programm ist ja auch genauso scheiße, wie das vorherige.

    also:

    //String erstellen
    string str;
    
    //Array aus Strings erstellen (hier 5 Stück), die von 0 - 4 angesprochen werden können
    string str[5];
    

    ...schön dass du als cpp-Experte auf die Welt gekommen bist. (Wortwahl!)

    Aber mit den 'std::string Teststring[6]' liegt wirklich einiges in argen. So etwas habe ich so noch nicht gesehen und ich denke auch es ist ein Array of std::strings. Es ist also nicht vergleichbar mit einem 'char Teststring[6]'.

    @Ripleys: Soll lauf Aufgabenstellung ein std::string verwendet werden oder ein char-array? Oder steht da einfach nur, dass max. 6 Zeichen eingegeben werden sollen?

    viele Grüße,
    SBond



  • Da wir im Lande des allmächtigen C++ leben, ist std::string einem char-array vorziziehen. Reine Arrays statischer Größe werden recht selten gebraucht und sollten im Falle eines Falles durch std::array ersetzt werden, diese Klasse fängt nämlich gleich noch ungültige Indizes ab.



  • Es soll einfach ein Wort mit 5 Buchstaben angegeben werden.
    Das mit den Arrays tut mir leid, da hab ich wirklich nen Bock geschossen wohl..
    hab das soweit berichtigt, es läuft auch endlich, nur ich krieg egal bei welcher eingabe, die ausgabe:

    JOUFD
    Sie haben eingegeben: JOUFD
    Verschlüsselt ist das 0x61feec

    Es fehlt also die entschlüsselung und die Verschlüsselung ist auch nicht ganz richtig..

    #include <iostream>
    #include <string>
    
    char Verschluesselung(char Teststring[6], int j)
    {
    
    	char Lookup[2][27] = {"ABCDEFGHIJKLMNOPQRSTUVWXYZ","MNOPQRSTUVWXYZABCDEFGHIJKL"};
    	for(int i=0; i<=26; i++)
    	{
    	if(Teststring[j] == Lookup[0][i])
    	{
    		char c = Lookup[1][i] ;
    	return c;
    	}
    	}
    	return 'X';
    }
    
    std::string Entschluesselung(std::string Code)
    		{
    	char Entschluesselt[6];
    	char Lookback[2][27] = {"MNOPQRSTUVWXYZABCDEFGHIJKL","ABCDEFGHIJKLMNOPQRSTUVWXYZ" } ;
    	for(int x=0; x<=5; x++) {
    	for(int i=0; i<=26; i++)
    		{
    		if(Code[x] == Lookback[0][i])
    			{
    			Entschluesselt[x]=Lookback[1][i];
    			break;
    			}
    		}
    		}
    	return Entschluesselt;
    		}
    
    int main() {
    	char Teststring[6];
    	std::cin >> Teststring;
    	char Verschluesselt[6];
    	char Entschluesselt[6];
    	for (int j=0; j<=5; j++)
    	{
    	 Verschluesselt[j] = Verschluesselung(Teststring,j);
    	}
    	std::cout << "Sie haben eingegeben: " << Teststring << std::endl;
    
    	std::cout << "Verschlüsselt ist das " << Verschluesselt << std::endl ;
    	Entschluesselt= Entschluesselung(Verschluesselt);
    	std::cout << "Wiederum entschluesselt ist das " << Entschluesselt << std::endl ;
    	return 0;
    
    }
    


  • 6 Habe ich halt eingetragen wegen dem '\0' am ende des strings



  • #include <iostream>
    #include <string>
    
    char Verschluesselung(char Teststring[6], int j)
    {
    
    	char Lookup[2][27] = {"ABCDEFGHIJKLMNOPQRSTUVWXYZ","MNOPQRSTUVWXYZABCDEFGHIJKL"};
    	for(int i=0; i<=26; i++)
    	{
    		if(Teststring[j] == Lookup[0][i])
    		{
    			char c = Lookup[1][i] ;
    			return c;
    		}
    	}
    	return 'X';
    }
    
    std::string Entschluesselung(std::string Code)
    {
    	char Entschluesselt[6];
    	char Lookback[2][27] = {"MNOPQRSTUVWXYZABCDEFGHIJKL","ABCDEFGHIJKLMNOPQRSTUVWXYZ" } ;
    	for(int x=0; x<=5; x++) {
    		for(int i=0; i<=26; i++)
    		{
    			if(Code[x] == Lookback[0][i])
    			{
    				Entschluesselt[x]=Lookback[1][i];
    				break;
    			}
    		}
    	}
    	return Entschluesselt;
    }
    
    int main() {
    	char Teststring[6] = "ABCDE";
    	std::cin >> Teststring;
    	char Verschluesselt[6];
    	std::string Entschluesselt;		// --> std::string statt char
    	for (int j=0; j<=5; j++)
    	{
    		Verschluesselt[j] = Verschluesselung(Teststring,j);
    	}
    	std::cout << "Sie haben eingegeben: " << Teststring << std::endl;
    	std::cout << "Verschlüsselt ist das " << Verschluesselt << std::endl ;
    	Entschluesselt= Entschluesselung(Verschluesselt);  // Entschluesselung() gibt einen std::string zurück und kein char[]
    	std::cout << "Wiederum entschluesselt ist das " << Entschluesselt << std::endl ;
    	return 0;
    
    }
    

    Ausgabe:

    HALLO
    Sie haben eingegeben: HALLO
    Verschlüsselt ist das TMXXA
    Wiederum entschluesselt ist das HALLO
    

    So geht es.
    Allerdings gibt es bei diesem Code keine Sicherung bei der Eingabe. Wenn du mehr Zeichen eintippst, kommt es zum Überlauf.



  • Deshalb std::string benützen.



  • dub di dub.

    #include <cstddef>
    #include <cctype>
    #include <string>
    #include <iostream>
    
    std::string rotate( std::string const & str, std::size_t offset )
    {
    	std::string dst;
    
    	for( auto ch : str ) {
    		if( std::islower( ch ) )
    			dst += 'a' + ( ( ch - 'a' + offset ) % ( 'z' - 'a' + 1 ) );
    		else if( std::isupper( ch ) )
    			dst += 'A' + ( ( ch - 'A' + offset ) % ( 'Z' - 'A' + 1 ) );
    		else dst += ch;
    	}
    
    	return dst;
    }
    
    int main()
    {
    	std::string input;
    	std::cin >> input;
    
    	for( std::size_t i{}; i <= 'z' - 'a' + 1; ++i )
    		std::cout << rotate( input, i ) << '\n';
    
    	std::cout.put( '\n' );
    }
    


  • Swordfish schrieb:

    dub di dub.

    #include <cstddef>
    #include <cctype>
    #include <string>
    #include <iostream>
    
    std::string rotate( std::string const & str, std::size_t offset )
    {
    	std::string dst;
    
    	for( auto ch : str ) {
    		if( std::islower( ch ) )
    			dst += 'a' + ( ( ch - 'a' + offset ) % ( 'z' - 'a' + 1 ) );
    		else if( std::isupper( ch ) )
    			dst += 'A' + ( ( ch - 'A' + offset ) % ( 'Z' - 'A' + 1 ) );
    		else dst += ch;
    	}
    
    	return dst;
    }
    
    int main()
    {
    	std::string input;
    	std::cin >> input;
    
    	for( std::size_t i{}; i <= 'z' - 'a' + 1; ++i )
    		std::cout << rotate( input, i ) << '\n';
    
    	std::cout.put( '\n' );
    }
    

    🤡 🤡 🤡



  • Danke für die Hilfe! 🙂
    Eine frage hätte ich aber noch,
    wieso krieg ich denn ne fehlermeldung bei Entschluesselt=Entschluesselung(..); wenn ich entschluesselt als chararray deklariere, aber keine weil ich eig bei entschlue3sselung nen std::string returnen sollte, aber dort nen chararray returne? 😕



  • Arrays können nicht zurückgegeben werden, genauso wenig wie du Arrays einander zuweisen kannst.
    Deshalb wurde std::string erfunden.



  • Danke !



  • Insgesamt werden die eingebauten Arrays nie gebraucht, eher werden dynamische Container wie vector und string benutzt, für statische Sachen gibt es std::array.


Anmelden zum Antworten