Hilfe bei cpp-script gebraucht!
-
Hi leuTe!
Zuersteinmal muss ich sagen, dass ich ein n00b bin.
Ich kann html/js/php-scripts schreiben und dachte mir warum nicht mal mit C++ probieren?
OK, ich hab mir also ein c++-Buch gekauft und Microsoft Visual Studio installiert.
So nun zu meinem Problem!
Ich hab (versucht) ein Konsolen-Programm zu schreiben, dass Text verschlüsselt und entschlüsselt.
(es ersetzt einfach die bucstaben durch zahlenkombis)Das VERschlüssen klappt ja noch.
Auch der Compiler findet keine Fehler.
(müsste also logischer Fehler sein, oder?)
Aber immer wenn man versucht einen längeren Code zu entschlüsseln kommt bei mir eine Fehlermeldung "Debug Error! abnormal program termination".
FrageZeichen? hier ist mein latein am ende... help!Achja.. hier das \1:
#include <iostream> #include <string> using namespace std; string code1[27]; string code2[27]; // definiert was mit wem ersetzt werden soll int codec() { code1[0]="w"; code2[0]="11"; code1[1]="y"; code2[1]="21"; code1[2]="i"; code2[2]="31"; code1[3]="j"; code2[3]="41"; code1[4]="k"; code2[4]="51"; code1[5]="v"; code2[5]="12"; code1[6]="g"; code2[6]="22"; code1[7]="h"; code2[7]="32"; code1[8]="a"; code2[8]="42"; code1[9]="l"; code2[9]="52"; code1[10]="u"; code2[10]="13"; code1[11]="f"; code2[11]="23"; code1[12]="x"; code2[12]="33"; code1[13]="b"; code2[13]="43"; code1[14]="m"; code2[14]="53"; code1[15]="t"; code2[15]="14"; code1[16]="e"; code2[16]="24"; code1[17]="d"; code2[17]="34"; code1[18]="c"; code2[18]="44"; code1[19]="n"; code2[19]="54"; code1[20]="s"; code2[20]="15"; code1[21]="r"; code2[21]="25"; code1[22]="q"; code2[22]="35"; code1[23]="p"; code2[23]="45"; code1[24]="o"; code2[24]="55"; code1[25]="z"; code2[25]="00"; code1[26]=" "; code2[26]="56"; return 0; } // nur eine schluss-nachricht.. int escape() { cout << "\n\nGut, dann bis bald!\n\n"; return 0; } // coden() - text verschlüsseln - funktioniert (meines wissens) int coden() { string text; cout << "OK, ich schreibe mit..\n"; cin >> text; codec(); int pos=0; cout << "\nLaenge: " << text.length() << "\n\n"; long i; for(i=0; i<25; i++) { pos=0; while( pos < text.length() ) { pos=text.find(code1[[i]i[/i]],pos); if(pos < text.length() ) text.replace(pos, 1, code2[[i]i[/i]]) ; else pos=text.length(); pos++; if(pos < text.length()) cout << pos << " "; } } cout << "\nOutput: " << text << "\n\n"; return 0; } [b]// [e]rarr[/e] DAS PROBLEMKIND (glaub ich) - zum entschlüsseln [e]larr[/e][/b] int encoden() { string text; cout << "Bitte geben Sie den verschlüsselten Text ein:\n"; cin >> text; codec(); long pos=0; long osig; cout << "\nLaenge: " << text.length() << "\n\n"; long i; int gefunden[27]; string str; for(i=0; i<27; i++) { pos=0; while( pos <= text.length() ) { str=text.substr(pos, 2); //altes zeichen enthalten? wenn ja umgehen for(long j=i-1;j>=0;j--) { if(gefunden[j]!=1) continue; osig=str.find(code1[j],0); if(osig<2 && osig>-1) { if(osig==0) pos++; if(osig==1) pos--; //debug cout << "\nAchtung! "<<code1[j]<<" gefunden! in stelle" <<osig<<endl; str=text.substr(pos, 2); j=-1; } } if(code2[[i]i[/i]]==str) { text.replace(pos, 1, code1[[i]i[/i]]); text.erase(pos+1,1); //debug cout << "Durchgang " <<i<< " ersetzt (pos" <<pos<< ") "<< str << " mit " << code1[[i]i[/i]] <<" !!!!!!!!!!!!!!!!!\n"; pos++; //debug cout << "1 pos hinzugefuegt"<<endl; gefunden[[i]i[/i]]=1; } else { //debug cout << "Durchgang " <<i<< " nicht erkannt (pos" <<pos<< ") "<< str << " mit " << code1[[i]i[/i]] <<endl; pos+=2; //debug cout << "2 pos hinzugefuegt"<<endl; } } } cout << "\nOutput: " << text << "\n\n"; return 0; } // menue .. das problem liegt im punkt 2 encoden() int main() { cout << "\nCrypt-Programm\n"; cout << "\n\nWas kann ich fuer Sie tun?\n\n" << " <1> Etwas verschluesseln...\n" << " <2> Etwas entschluesseln...\n" << " <0> Ach, garnichts.\n"; int menu; cin >> menu; if(menu == 1) { coden(); return 0; } else if(menu == 2) { encoden(); return 0;} else if(menu == 0) {} else { cout << "Eingabe unbekannt! versuch es nochmal!\n"; main(); } escape(); return 0; }P.S. ich weiß, dass nicht die beste art ist etwas zu verschlüsseln aber es geht...
-
xXephis schrieb:
Aber immer wenn man versucht einen längeren Code zu entschlüsseln kommt bei mir eine Fehlermeldung "Debug Error! abnormal program termination".
FrageZeichen? hier ist mein latein am ende... help!Hier hilft ein Debugger.
An dieser Stelle:
str=text.substr(pos, 2);wird offenbar pos -1, und es knallt.
Deine Entschlüsselungsmethode ist übrigens sehr umständlich. Warum gehst du nicht einfach von links nach rechts durch und suchst das passende Zeichen aus Code1? Statt "in place" zu ersetzen, würde ich einen zweiten String aufbauen. Sonst musst du dich mit teilersetzten, unterschiedlich langen Codes abplagen.Achja.. hier das \1:
Für C und C++ benutzt man üblicherweise nicht das Wort "Script".
-
btw: schau mal in nen Wörterbuch..
encode ist verschlüsseln und decode ist entschlüsseln
-
hallo, ich würde das ganze eher objektorientiert machen:
#include <iostream> #include <string> using namespace std; class Kodierer { public: static Kodierer &Objekt() { static Kodierer objekt = Kodierer(); return objekt; } string verschluessle(const string &klar) const { string ergebnis = ""; int klarIndex; for(string::size_type i=0; i<klar.length(); ++i) if( ( klarIndex=indexKlarZeichen(klar[i]) ) >= 0 ) ergebnis.append(m_kodiert[klarIndex]); return ergebnis; } string entschluessle(const string &kodiert) const { string ergebnis = ""; int kodierIndex; for(string::size_type i=0; i<kodiert.length(); i+=2) if( ( kodierIndex=indexKodierZeichen(kodiert.substr(i,2)) ) >= 0 ) ergebnis.append(&m_klar[kodierIndex],1); return ergebnis; } private: int indexKlarZeichen(char zeichen) const { for(int i=0; i<ANZAHL_ZEICHEN; ++i) if(m_klar[i]==zeichen) return i; return -1; } int indexKodierZeichen(string zeichen) const { for(int i=0; i<ANZAHL_ZEICHEN; ++i) if(m_kodiert[i]==zeichen) return i; return -1; } Kodierer(const Kodierer &k){} Kodierer() { m_klar[0]='w';m_kodiert[0]="11"; m_klar[1]='y';m_kodiert[1]="21"; m_klar[2]='i';m_kodiert[2]="31"; m_klar[3]='j';m_kodiert[3]="41"; m_klar[4]='k';m_kodiert[4]="51"; m_klar[5]='v';m_kodiert[5]="12"; m_klar[6]='g';m_kodiert[6]="22"; m_klar[7]='h';m_kodiert[7]="32"; m_klar[8]='a';m_kodiert[8]="42"; m_klar[9]='l';m_kodiert[9]="52"; m_klar[10]='u';m_kodiert[10]="13"; m_klar[11]='f';m_kodiert[11]="23"; m_klar[12]='x';m_kodiert[12]="33"; m_klar[13]='b';m_kodiert[13]="43"; m_klar[14]='m';m_kodiert[14]="53"; m_klar[15]='t';m_kodiert[15]="14"; m_klar[16]='e';m_kodiert[16]="24"; m_klar[17]='d';m_kodiert[17]="34"; m_klar[18]='c';m_kodiert[18]="44"; m_klar[19]='n';m_kodiert[19]="54"; m_klar[20]='s';m_kodiert[20]="15"; m_klar[21]='r';m_kodiert[21]="25"; m_klar[22]='q';m_kodiert[22]="35"; m_klar[23]='p';m_kodiert[23]="45"; m_klar[24]='o';m_kodiert[24]="55"; m_klar[25]='z';m_kodiert[25]="00"; m_klar[26]=' ';m_kodiert[26]="56"; } static const int ANZAHL_ZEICHEN = 27; static char m_klar[ANZAHL_ZEICHEN]; static string m_kodiert[ANZAHL_ZEICHEN]; }; char Kodierer::m_klar[]; string Kodierer::m_kodiert[]; int main() { Kodierer &k = Kodierer::Objekt(); string kodiert = k.verschluessle("hallo"); cout << kodiert << endl; cout << k.entschluessle(kodiert) << endl; cin.get(); }