einfaches Bruteforce Prog mit fehler =C
-
std::string bringt doch das gleiche, wie die andere variante, oder?
Weil ich hab des jetzt en bissel verändert, und dann kamen 1000 fehlermeldungen und ich hab des wieder verworfen.
aber so müssts doch auch gehen.Aso ich hab noch nen Fehler entdeckt. Wenn man 1 eingibt, dann kommt:
a4D
b4D
c4D
...und dann kommt nur noch komisches zeug. Ihr könnt den code ja mal compilen. Dann seht ihrs.
-
1337shaddow schrieb:
std::string bringt doch das gleiche, wie die andere variante, oder?
Nein. Unter anderem würde dies die folgenden Probleme lösen:
a) Deine Ausgabe ist total undefiniert, weil du überhaupt nicht auf die für C-Strings nötige Nullterminierung achtest.
b) Du bräuchtest dich beim Reservieren des Speichers für das aktuelle Wort nicht auf spezielle Features deines Compilers verlassen, sondern auf den C+=-Standard verlassen. Dadurch könntest du dein Programm dann auch mit jedem beliebigen Compiler übersetzen. Vermutlich ist es dir noch nicht einmal bewusst, aberchar aktuelles_wort[anzahl_zeichen];ist nicht durch den (aktuellen) Standard gedeckt.Natürlich ist es nicht damit getan, einfach in der Definition char gegen std::string zu tauschen, ein bisschen Anpassung deines Programmes wäre schon noch nötig.
-
In meinem steten Streben nach unnötig komplizierten Antworten auf einfache Fragen, habe ich dieses Monstrum erschaffen:
#include <iostream> #include <string> #include <vector> #include <cstddef> #include <algorithm> using namespace std; class increasable_word { private: typedef std::vector<size_t> word_type; word_type word_as_number; string const alphabet; public: increasable_word(size_t size, const string& alphabet): word_as_number(size), alphabet(alphabet) {} increasable_word operator++() { word_type::iterator i = word_as_number.begin(); bool go_on; do { go_on=false; (*i)++; *i %= alphabet.size(); if ((*i) == 0) { go_on=true; ++i; } } while (go_on && (i != word_as_number.end())); return *this; } string as_string() const { string output (word_as_number.size(), 0); word_type::const_iterator i = word_as_number.begin(); for (string::reverse_iterator j = output.rbegin(); j!=output.rend(); ++i, ++j) *j=alphabet[*i]; return output; } bool maxed() { return (count(word_as_number.begin(), word_as_number.end(), alphabet.size()-1) == word_as_number.size()); } }; ostream& operator<<(ostream &out, const increasable_word& word) { out << word.as_string(); return out; } int main() { cout<<"Wieviele Zeichen soll das Wort haben?"<<endl; size_t anzahl_zeichen; cin >> anzahl_zeichen; increasable_word aktuelles_wort(anzahl_zeichen, "ABCDEFG"); do cout << ++aktuelles_wort<<endl; while (! aktuelles_wort.maxed()); }Immerhin hält es das Hauptprogramm schön übersichtlich.
Ich hatte auch an eine Lösung gedacht, mittels TMP alle erdenklichen Kombinationen zur Compilerzeit zu berechnen. Tatsächlich wäre dies sogar ziemlich einfach mit TMP. Aber mehrere Millionen Jahre Übersetzungszeit wollte ich dem Compiler dann doch nicht zumuten.

-
SeppJ schrieb:
In meinem steten Streben nach unnötig komplizierten Antworten auf einfache Fragen, habe ich dieses Monstrum erschaffen:
hast du das Monstrum auch schonmal ausprobiert? Weil bei mir(Dev C++ Compiler) funzt es nicht. da kann man eine Zahl eingeben, und dann kommt nix mehr
-
Jetzt weis ich, wo mein Fehler ist, aber ich weis nicht wie ich ihn loswerde. dafür hab ich einen anderen fehler gekillt!
bei der if(counter == 63) hab ich vergessen, den counter wieder zurückzusetzen. Deshalb auch die komischen werte(die komischen Zeichen).Mein Fehler ist jetzt nur noch, dass es nicht den Buchstaben, der vor dem letzten Buchstaben ist, verändert. Ich hab das jetzt mal mit einer (nicht so tollen) if abfrage gemacht. komischerweise verändert es den vorrangegangenen buchstaben trotzdem nicht.

Jetzt kommt diese ausgabe(bei 3 Buchstaben):
aaa
aab
aac
...
aa0
aa
aaa
aab
aac
aad
...Ist doch schon besser, oder??

Aber eben noch nicht richtig
Hier ist der code:
#include <iostream> #include <string.h> #include <conio.h> using namespace std; int anzahl_zeichen, aktuelles_zeichen, counter = 0, counterIII=-1; bool abbruch = false; //Buchstaben und Zahlen in einem Array speichern char alle_zeichen[63] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; int main(){ //Liest ein wie viele zeichen das Wort aus der Brute-Force Attacke haben soll cout<<"Wieviele Zeichen soll das Wort haben?\n"; cin>>anzahl_zeichen; //erstellt einen leeren String mit der anzahl an zeichen als Länge char aktuelles_wort[anzahl_zeichen]; //Füllt das leere wort mit zeichen(immer "a") while(counterIII!=anzahl_zeichen-1){ counterIII++; aktuelles_wort[counterIII]='a';} //gibt das Wort aus, da es sonst bei aa...aaab anfangen würde cout<< aktuelles_wort << endl; //Die Schleife, die die Wörter generiert und ausgibt, mit der Abbruchsbedingung, die bei bhjkfgsduf(unten) überprüft wird while(abbruch == false){ //setzt den zähler, der die Position des Buchstaben angibt aktuelles_zeichen = anzahl_zeichen-1; //erhöht den counter, der den buchstaben bestimmt um eins höher counter++; //falls der counter mit der null fertig ist, wird als zeichen ein a gespeichert und das zeichen um eins zurückgesetzt //dann wird das so oft wiederholt, bis man beim ersten zeichen ankommt. Wenn das auch null ist wird die abbruchsbedingung erfüllt //und der Bool-schalter abbruch auf true gesetzt(bhjkfgsduf) if(counter == 63){ counter = 0; aktuelles_wort[aktuelles_zeichen] = 'a'; aktuelles_zeichen--; while(aktuelles_wort[aktuelles_zeichen] == '0' && aktuelles_zeichen >= 0){ aktuelles_wort[aktuelles_zeichen] = 'a'; aktuelles_zeichen--; //Erhöht das andere Zeichen um eins if(aktuelles_wort[aktuelles_zeichen] == 'a'){aktuelles_wort[aktuelles_zeichen] = 'b';} else if(aktuelles_wort[aktuelles_zeichen] == 'b'){aktuelles_wort[aktuelles_zeichen] = 'c';} else if(aktuelles_wort[aktuelles_zeichen] == 'c'){aktuelles_wort[aktuelles_zeichen] = 'd';} else if(aktuelles_wort[aktuelles_zeichen] == 'd'){aktuelles_wort[aktuelles_zeichen] = 'e';} else if(aktuelles_wort[aktuelles_zeichen] == 'e'){aktuelles_wort[aktuelles_zeichen] = 'f';} else if(aktuelles_wort[aktuelles_zeichen] == 'f'){aktuelles_wort[aktuelles_zeichen] = 'g';} else if(aktuelles_wort[aktuelles_zeichen] == 'g'){aktuelles_wort[aktuelles_zeichen] = 'h';} else if(aktuelles_wort[aktuelles_zeichen] == 'h'){aktuelles_wort[aktuelles_zeichen] = 'i';} else if(aktuelles_wort[aktuelles_zeichen] == 'i'){aktuelles_wort[aktuelles_zeichen] = 'j';} else if(aktuelles_wort[aktuelles_zeichen] == 'j'){aktuelles_wort[aktuelles_zeichen] = 'k';} else if(aktuelles_wort[aktuelles_zeichen] == 'k'){aktuelles_wort[aktuelles_zeichen] = 'l';} else if(aktuelles_wort[aktuelles_zeichen] == 'l'){aktuelles_wort[aktuelles_zeichen] = 'm';} else if(aktuelles_wort[aktuelles_zeichen] == 'm'){aktuelles_wort[aktuelles_zeichen] = 'n';} else if(aktuelles_wort[aktuelles_zeichen] == 'n'){aktuelles_wort[aktuelles_zeichen] = 'o';} else if(aktuelles_wort[aktuelles_zeichen] == 'o'){aktuelles_wort[aktuelles_zeichen] = 'p';} else if(aktuelles_wort[aktuelles_zeichen] == 'p'){aktuelles_wort[aktuelles_zeichen] = 'q';} else if(aktuelles_wort[aktuelles_zeichen] == 'q'){aktuelles_wort[aktuelles_zeichen] = 'r';} else if(aktuelles_wort[aktuelles_zeichen] == 'r'){aktuelles_wort[aktuelles_zeichen] = 's';} else if(aktuelles_wort[aktuelles_zeichen] == 's'){aktuelles_wort[aktuelles_zeichen] = 't';} else if(aktuelles_wort[aktuelles_zeichen] == 't'){aktuelles_wort[aktuelles_zeichen] = 'u';} else if(aktuelles_wort[aktuelles_zeichen] == 'u'){aktuelles_wort[aktuelles_zeichen] = 'v';} else if(aktuelles_wort[aktuelles_zeichen] == 'v'){aktuelles_wort[aktuelles_zeichen] = 'w';} else if(aktuelles_wort[aktuelles_zeichen] == 'w'){aktuelles_wort[aktuelles_zeichen] = 'x';} else if(aktuelles_wort[aktuelles_zeichen] == 'x'){aktuelles_wort[aktuelles_zeichen] = 'y';} else if(aktuelles_wort[aktuelles_zeichen] == 'y'){aktuelles_wort[aktuelles_zeichen] = 'z';} else if(aktuelles_wort[aktuelles_zeichen] == 'z'){aktuelles_wort[aktuelles_zeichen] = 'A';} else if(aktuelles_wort[aktuelles_zeichen] == 'A'){aktuelles_wort[aktuelles_zeichen] = 'B';} else if(aktuelles_wort[aktuelles_zeichen] == 'B'){aktuelles_wort[aktuelles_zeichen] = 'C';} else if(aktuelles_wort[aktuelles_zeichen] == 'C'){aktuelles_wort[aktuelles_zeichen] = 'D';} else if(aktuelles_wort[aktuelles_zeichen] == 'D'){aktuelles_wort[aktuelles_zeichen] = 'E';} else if(aktuelles_wort[aktuelles_zeichen] == 'E'){aktuelles_wort[aktuelles_zeichen] = 'F';} else if(aktuelles_wort[aktuelles_zeichen] == 'F'){aktuelles_wort[aktuelles_zeichen] = 'G';} else if(aktuelles_wort[aktuelles_zeichen] == 'G'){aktuelles_wort[aktuelles_zeichen] = 'H';} else if(aktuelles_wort[aktuelles_zeichen] == 'H'){aktuelles_wort[aktuelles_zeichen] = 'I';} else if(aktuelles_wort[aktuelles_zeichen] == 'I'){aktuelles_wort[aktuelles_zeichen] = 'J';} else if(aktuelles_wort[aktuelles_zeichen] == 'J'){aktuelles_wort[aktuelles_zeichen] = 'K';} else if(aktuelles_wort[aktuelles_zeichen] == 'K'){aktuelles_wort[aktuelles_zeichen] = 'L';} else if(aktuelles_wort[aktuelles_zeichen] == 'L'){aktuelles_wort[aktuelles_zeichen] = 'M';} else if(aktuelles_wort[aktuelles_zeichen] == 'M'){aktuelles_wort[aktuelles_zeichen] = 'N';} else if(aktuelles_wort[aktuelles_zeichen] == 'N'){aktuelles_wort[aktuelles_zeichen] = 'O';} else if(aktuelles_wort[aktuelles_zeichen] == 'O'){aktuelles_wort[aktuelles_zeichen] = 'P';} else if(aktuelles_wort[aktuelles_zeichen] == 'P'){aktuelles_wort[aktuelles_zeichen] = 'Q';} else if(aktuelles_wort[aktuelles_zeichen] == 'Q'){aktuelles_wort[aktuelles_zeichen] = 'R';} else if(aktuelles_wort[aktuelles_zeichen] == 'R'){aktuelles_wort[aktuelles_zeichen] = 'S';} else if(aktuelles_wort[aktuelles_zeichen] == 'S'){aktuelles_wort[aktuelles_zeichen] = 'T';} else if(aktuelles_wort[aktuelles_zeichen] == 'T'){aktuelles_wort[aktuelles_zeichen] = 'U';} else if(aktuelles_wort[aktuelles_zeichen] == 'U'){aktuelles_wort[aktuelles_zeichen] = 'V';} else if(aktuelles_wort[aktuelles_zeichen] == 'V'){aktuelles_wort[aktuelles_zeichen] = 'W';} else if(aktuelles_wort[aktuelles_zeichen] == 'W'){aktuelles_wort[aktuelles_zeichen] = 'X';} else if(aktuelles_wort[aktuelles_zeichen] == 'X'){aktuelles_wort[aktuelles_zeichen] = 'Y';} else if(aktuelles_wort[aktuelles_zeichen] == 'Y'){aktuelles_wort[aktuelles_zeichen] = 'Z';} else if(aktuelles_wort[aktuelles_zeichen] == 'Z'){aktuelles_wort[aktuelles_zeichen] = '1';} else if(aktuelles_wort[aktuelles_zeichen] == '1'){aktuelles_wort[aktuelles_zeichen] = '2';} else if(aktuelles_wort[aktuelles_zeichen] == '2'){aktuelles_wort[aktuelles_zeichen] = '3';} else if(aktuelles_wort[aktuelles_zeichen] == '3'){aktuelles_wort[aktuelles_zeichen] = '4';} else if(aktuelles_wort[aktuelles_zeichen] == '4'){aktuelles_wort[aktuelles_zeichen] = '5';} else if(aktuelles_wort[aktuelles_zeichen] == '5'){aktuelles_wort[aktuelles_zeichen] = '6';} else if(aktuelles_wort[aktuelles_zeichen] == '6'){aktuelles_wort[aktuelles_zeichen] = '7';} else if(aktuelles_wort[aktuelles_zeichen] == '7'){aktuelles_wort[aktuelles_zeichen] = '8';} else if(aktuelles_wort[aktuelles_zeichen] == '8'){aktuelles_wort[aktuelles_zeichen] = '9';} else if(aktuelles_wort[aktuelles_zeichen] == '9'){aktuelles_wort[aktuelles_zeichen] = '0';} aktuelles_zeichen = anzahl_zeichen-1;}//von der while(aktuelles_wort[aktuelles_zeichen} == '0' ... if(aktuelles_zeichen==0 && aktuelles_wort[aktuelles_zeichen] == '0'){abbruch=true;}//bhjkfgsduf }//von der if(counter ==63) //dann wird das zeichen in dem Wort gespeichert und ausgegeben. aktuelles_wort[aktuelles_zeichen] = alle_zeichen[counter]; cout<< aktuelles_wort << endl; getch();//nur zum testen. Wird wieder entfernt }//von der while(true) getch(); }//von der int main