problem mit std::string



  • hi leute!
    kann mir jemand sagn was ich da falsch mache??
    ich kommt da nit drauf...;-(

    cu

    #include <stdio.h>
    #include <iostream.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <string.h>
    #include <string>
    using namespace std;
    
    class Kryptographie
    {	
    	private:
    		string verschluesselt;
    		unsigned int schluessel;
    
    	public:
    		Kryptographie();
    		string get_verschluesselt();
    		void generate_Schluessel();
    		unsigned int get_Schluessel();
    		string verschluesseln(string text);
    		string entschluesseln();
    };
    
    Kryptographie::Kryptographie():schluessel(0)
    {
    	generate_Schluessel();
    }
    
    void Kryptographie::generate_Schluessel()
    {
    	// Zufallsschluessel erzeugen
    	srand((unsigned ) time (NULL));
    	schluessel = rand();
    }
    
    unsigned int Kryptographie::get_Schluessel()
    {
    	return schluessel;
    }
    
    string Kryptographie::get_verschluesselt()
    {
    	return verschluesselt.c_str();
    }
    
    string Kryptographie::verschluesseln(string text)
    {  
    	const text_MAX = text.length();
    
        // Verschluesseln
        for(int i = 0; i < text_MAX; i++)
        {
             verschluesselt[i] = (text[i] + (char)get_Schluessel()) % 256;
        }
    
        return verschluesselt.c_str(); 
    }
    
    string Kryptographie::entschluesseln()
    {
    	string verschluesselter_text = get_verschluesselt();
    	string entschluesselter_text;
        const verschluesselt_MAX = verschluesselter_text.length();
    
    	// Entschluesseln
    	for(int i = 0; i < verschluesselt_MAX; i++)
    	{
    		entschluesselter_text[i] = (verschluesselter_text[i] - (char)get_Schluessel()) % 256;
    	}
    
    	return entschluesselter_text.c_str();
    }
    
    int main()
    {
    	Kryptographie Text;
    	cout << Text.verschluesseln("hallo").c_str() << endl;
    	cout << Text.entschluesseln().c_str() << endl;
    
    	return 0;
    }
    
    ---------------------------------------------------------------------------------
    ich bekomme folgede fehlermeldung:
    Die Anweisung in "0x004013cf" verweist auf Speicher in "0x0042a024". 
    Der Vorgang "written" kontte nicht auf dem Speicher durchgeführt werden.
    
    in der schleife:
    
        // Verschluesseln
        for(int i = 0; i < text_MAX; i++)
        {
             verschluesselt[i] = (text[i] + (char)get_Schluessel()) % 256;
        }
    


  • Zunächst kompiliert dein Code gar nicht:

    1. Die Header sollten ungefähr so aussehen:

    #include <cstdio>
    #include <iostream>
    #include <cstdlib>
    #include <cstring>
    #include <string>
    #include <ctime>

    2. text_MAX und verschluesselt_MAX haben keinen Typ.



  • Ponto schrieb:

    Zunächst kompiliert dein Code gar nicht:

    1. Die Header sollten ungefähr so aussehen:

    #include <cstdio>
    #include <iostream>
    #include <cstdlib>
    #include <cstring>
    #include <string>
    #include <ctime>

    2. text_MAX und verschluesselt_MAX haben keinen Typ.

    1.) das ja wurscht, solange der compliler gegen die header nix hat!
    mein code wird aber compeliert ohne error!!!

    2.) sind ja konstanten!

    der fehler liegt meiner meinung nach wo anders....



  • surf. schrieb:

    1.) das ja wurscht, solange der compliler gegen die header nix hat!
    mein code wird aber compeliert ohne error!!!

    2.) sind ja konstanten!

    der fehler liegt meiner meinung nach wo anders....

    Wenn dein Compiler da keinen Fehler meldet, würde ich mir einen richtigen C++ Compiler anlegen. Und auch wenn es Konstanten sind, brauchen sie einen Datentyp. Ein const int test_MAX und const int verschluesselt_MAX wuerden helfen. Abgesehen davon, scheint dein Code hier zu funktionieren.



  • hab jetzt deine header übernommen:
    #include <cstdio>
    #include <iostream>
    #include <cstdlib>
    #include <cstring>
    #include <string>
    #include <ctime>
    using namespace std;

    und den konstanten einen typ gegeben!
    aber das funktioniert trotzdem nicht:

    der debugger regt sich hier auf:

    // Verschluesseln
    for(int i = 0; i < text_MAX; i++)
    {
         verschluesselt[i] = (text[i] + (char)get_Schluessel()) % 256;
    }
    
    Nicht abgefangene Ausnahme in verschluesselung.exe: 0xC0000005: Access Violation.
    

    kann ich da bei einem std::string mit [i] zugreifen??? hm?

    cu



  • surf. schrieb:

    der debugger regt sich hier auf:

    // Verschluesseln
    for(int i = 0; i < text_MAX; i++)
    {
         verschluesselt[i] = (text[i] + (char)get_Schluessel()) % 256;
    }
    
    Nicht abgefangene Ausnahme in verschluesselung.exe: 0xC0000005: Access Violation.
    

    kann ich da bei einem std::string mit [i] zugreifen??? hm?

    cu

    Das Problem ist, dass verschluesselt und analog entschluesselter_text nicht die die richtige Größe haben um den Text aufzunehmen. Du greifst mit deinem [i] ausserhalb des richtigen Bereichs zu. Ein verschluesselt.resize(text_MAX) und analoges für entschluesselter_text sollten helfen.



  • da hast du recht!!!
    es geht!

    man muss speicher für verschluesselt und entschluesselter_text reservieren!

    danke dir!

    cu



  • was bekommst du da für ne fehlermeldung??
    weil ich fang mit den visual c6 compiler meldungen nit viel an bei so access voilation....



  • surf. schrieb:

    was bekommst du da für ne fehlermeldung??
    weil ich fang mit den visual c6 compiler meldungen nit viel an bei so access voilation....

    Bei Speicherverletzungen ist valgrind das Tool der Wahl. Das findet fast alles.

    Den VC6 würde ich links liegen lassen, das ist kein C++ Compiler - einfach zu alt. Ich hab gehört Microsoft hat seine Compiler letztens freigegeben.



  • ich hab mein prog erweitert:

    jedoch bin ich auf 2 error gestossen....hm was da los?

    cu

    #include <cstdio> 
    #include <iostream> 
    #include <cstdlib> 
    #include <cstring> 
    #include <string> 
    #include <ctime>
    using namespace std;
    
    class Kryptographie
    {	
    	private:
    		string verschluesselt;
    		//unsigned int schluessel;
    		//char *schluessel;
    		string schluessel;
    
    	public:
    		Kryptographie();
    		string get_verschluesselt();
    		//void generate_Schluessel();
    		void generate_Schluessel(unsigned int laenge);
    		string get_Schluessel();
    		string verschluesseln(string text);
    		string entschluesseln();
    };
    
    Kryptographie::Kryptographie():schluessel(0)
    {
    	generate_Schluessel(128);
    }
    
    /*void Kryptographie::generate_Schluessel()
    {
    	// Zufallsschluessel erzeugen
    	srand((unsigned ) time (NULL));
    	schluessel = rand();
    }*/
    
    void Kryptographie::generate_Schluessel(unsigned int laenge) 
    { 
         srand((unsigned ) time (NULL));
    
         /*if(schluessel != NULL) 
         { 
              //realloc( schluessel, laenge ); 
    		  schluessel.resize(laenge);		  
         } 
         else 
         { 
              //schluessel = (char*)calloc( laenge, sizeof(char));
         }*/ 
    
    	 schluessel.resize(laenge);
    
         for(int i = 0; i < laenge; i++) 
    	 {
              schluessel[i] = (char)rand(); 
    	 }
    }
    
    string Kryptographie::get_Schluessel()
    {
    	return schluessel.c_str();
    }
    
    string Kryptographie::get_verschluesselt()
    {
    	return verschluesselt.c_str();
    }
    
    string Kryptographie::verschluesseln(string text)
    {  
    	const unsigned int text_MAX = text.length();
    
    	// Speicher von verschluesselt reservieren 
    	verschluesselt.resize(text_MAX);
    
        // Verschluesseln
        for(int i = 0; i < text_MAX; i++)
        {
             verschluesselt[i] = (text[i] + get_Schluessel().c_str()) % 256;
        }
    
        return verschluesselt.c_str(); 
    }
    
    string Kryptographie::entschluesseln()
    {
    	string verschluesselter_text = get_verschluesselt();
    	const unsigned int verschluesselt_MAX = verschluesselter_text.length();
    	// Speicher von entschluesselter_text reservieren
    	string entschluesselter_text(verschluesselt_MAX, '$');
    
    	// string entschluesselter_text("", verschluesselt_MAX);
    
    	// Entschluesseln
    	for(int i = 0; i < verschluesselt_MAX; i++)
    	{
    		entschluesselter_text[i] = (verschluesselter_text[i] - get_Schluessel().c_str()) % 256;
    	}
    
    	return entschluesselter_text.c_str();
    }
    
    int main()
    {
    	Kryptographie Text;
    	cout << Text.verschluesseln("hallo").c_str() << endl;
    	cout << Text.entschluesseln().c_str() << endl;
    
    	return 0;
    }
    
    --------------------Konfiguration: verschluesselung - Win32 Debug--------------------
    Kompilierung läuft...
    main.cpp
    C:\verschluesselung\main.cpp(86) : error C2296: '%' : Ungültig, da der linke Operand vom Typ 'const char *' ist
    C:\verschluesselung\main.cpp(106) : error C2113: Zeiger kann nur von einem anderen Zeiger subtrahiert werden
    Fehler beim Ausführen von cl.exe.
    
    verschluesselung.exe - 2 Fehler, 0 Warnung(en)
    


  • // Verschluesseln
        for(int i = 0; i < text_MAX; i++)
        {
             verschluesselt[i] = (text[i] + get_Schluessel().c_str()) % 256;  // hier rechnest du: char = char + const char* 
        }
    
    // Entschluesseln
        for(int i = 0; i < verschluesselt_MAX; i++)
        {
            entschluesselter_text[i] = (verschluesselter_text[i] - get_Schluessel().c_str()) % 256;  // analog: char = char - const char*
        }
    

    was auch immer


Anmelden zum Antworten