Brauche Hilfe beim debuggen!



  • Ich hab ein Programm geschrieben was Text verschlüsselt, bloß leider hab ich da einen Bug drin 😡
    Wenn ich das Programm ausführe bekomme ich ne Fehlermeldung, dass das Program eben nicht mehr funktioniert.
    Hier erstmal der Code

    #include<iostream>
    using namespace std;
    
    void fEncrypt(char *OutBuffer,const char *Text)
    {
    	char Temp[3];
    	OutBuffer[0]=0;
    
    	for(int i=0;i<(int)(strlen(Text));i++)
    	{
    		sprintf(Temp,"%02x\0",Text[i]);
    		strcat(OutBuffer,Temp);
    	}
    }
    
    void fDecrypt(char *OutBuffer,char *Crypt)
    {
    	char cTemp;
    	int iLen=(int)(strlen(Crypt))/2;
    	for(int i=0;i<iLen;i++)
    	{
    		sscanf(Crypt,"%02x",&cTemp);
    		Crypt+=2;
    		OutBuffer[i]=cTemp;
    	}
    }
    
    int main()
    {
    	char Eingabe[16]="Hallo du";
    	char Encrypt[32]={0};
    	char Decrypt[16] ={0};
    	char Temp[3],cTemp;
    
    	fEncrypt(Encrypt,Eingabe);
    	cout<<Encrypt<<endl;
    
    	fDecrypt(Decrypt,Encrypt);
    	cout<<Decrypt<<endl;
    
    	return(0);
    }
    

    Probleme gibts meines Erachtens nach beim Aufruf von fDecrypt.
    Wäre nett wenn mal jamand Debugger spielen könnte 😋



  • Tu dir bitte einen Gefallen und erstze alle char-Arrays durch std::string und nutze dann dessen Funktionen.



  • Tut mir leid aber std::string wollte ich gerade vermeiden, weil ich später öfters direkt auf den Speicher zugreifen muss.

    Oder hast du etwa das Problem erkannt?



  • Ich hab den Code der 2 Funktionen mal direkt in das Programm eingefügt und siehe da, es geht! Nur hab ich das Problem meiner Funktionen immer noch nicht gefunden 😞

    int main()
    {
    	char Eingabe[16]="Hallo du";
    	char Encrypt[32]={0};
    	char Decrypt[16] ={0};
    	char Temp[3],cTemp;
    
    	for(int i=0;i<(int)(strlen(Eingabe));i++)
    	{
    		sprintf(Temp,"%02x\0",Eingabe[i]);
    		strcat(Encrypt,Temp);
    	}
    	cout<<Encrypt<<endl;
    
    	char *pC=Encrypt;
    
    	for(int i=0;i<(int)(strlen(Eingabe));i++)
    	{
    		sscanf(pC,"%02x",&cTemp);
    		pC+=2;
    		Decrypt[i]=cTemp;
    	}
    	cout<<Decrypt<<endl;
    
    	return(0);
    }
    

    Das hier geht nur die funktionen nicht 😞



  • Eigentlich sollte man dich mit diesem Code selbst suchen lassen. 😉

    Die Erfahrung wird dich echt weiterbringen. 😃

    Daher auch nur ein Tipp: Überleg mal was der Format-Specifier %02x in deiner Funktion fDecrypt bedeutet und ober das auch alles in die Variable cTemp passt.



  • Danke es funktioniert. ABER wieso bringt dann dieser Code das selbe Egebnis
    obwohl cTemp hier char ist?

    int main()
    {
    	const char Eingabe[16]="Hallo du da!";
    	char Encrypt[32]={0};
    	char Decrypt[16] ={0};
    	char Temp[3], cTemp;
    
    	for(int i=0;i<(int)(strlen(Eingabe));i++)
    	{
    		sprintf(Temp,"%02x\0",Eingabe[i]);
    		strcat(Encrypt,Temp);
    	}
    	cout<<Encrypt<<endl;
    
    	char *pC=Encrypt;
    
    	for(int i=0;i<(int)(strlen(Encrypt))/2;i++)
    	{
    		sscanf(pC,"%02x",&cTemp);
    		pC+=2;
    		Decrypt[i]=cTemp;
    	}
    	cout<<Decrypt<<endl;
    
    	return(0);
    }
    


  • Blaze schrieb:

    Tut mir leid aber std::string wollte ich gerade vermeiden, weil ich später öfters direkt auf den Speicher zugreifen muss.

    Wie meinst du das?

    BTW gäbs auch die Möglichkeit, für die Verschlüsselung den Luxus von std::string zu genießen und das Ergebnis in ein char-Array zu hauen (Stichwort string::c_str()).



  • Blaze schrieb:

    ... ABER wieso bringt dann dieser Code das selbe Egebnis
    obwohl cTemp hier char ist?...

    sscanf() überschreibt in deinem Fall die Position hinter der Variable cTemp gnadenlos.

    Je nachdem, was sich dort befindet hat das auch verschiedene Auswirkungen. Das kann "nur" eine Änderung in einem von dir selbst angelegten Array sein bis hin zu dem Fall, dass die Adresse hinter der Varibale cTemp noch garnicht reserviert war und du einen Speicherfehler bekommst.

    Das macht diese Funktionen ja so gefährlich und Fehler so schwer aufzufinden.



  • Michael E. schrieb:

    Blaze schrieb:

    Tut mir leid aber std::string wollte ich gerade vermeiden, weil ich später öfters direkt auf den Speicher zugreifen muss.

    Wie meinst du das?

    BTW gäbs auch die Möglichkeit, für die Verschlüsselung den Luxus von std::string zu genießen und das Ergebnis in ein char-Array zu hauen (Stichwort string::c_str()).

    Nuja, schlecht ist std::string ja net bloß in meinen Fall brauch ichs noch nich mal für die Eingabe,
    weil die Konsole nur zum testen war und das ganze noch (richtig) verschlüsselt wird.



  • Wenn du die "Stringfunktionen" von std::string nicht brauchst, dann könntest du auch einen std::vector<char> verwenden. Da hast du auch den Zugriff über den Indexoperator und du hast halt den Vorteil, dass du dich nicht um den Speicher kümmern musst.


Anmelden zum Antworten