Programmfehler
-
Mir sind 2 Bugs im Programm aufgefallen:
1. Es wird das Leerzeichen ausgegeben, obwohl im BasicZeichensatz[] kein Leerzeichen vorhanden ist.
2. Wenn ich die erwuenschte PW-Laenge z. B. 100 eingebe und dannach das erzeugte file (PWGen*) öffne ist der inhalt folgender:
愺䍇㐢乁玒鉰礬≊張佞圣湔筍剎陛甮䱏潉㭾圡⨩䝡㝃㴵橸㙇⍬╃䙟之畦㍾唶搾䑟吸⽹嵩⩲䵕筡.㔰䱑欷筁䰲䬪昹
Obwohl im Programm also in Zeile 52 etwas anderes ausgegeben wird.
MfG, bashzeronine :p
-
bashzeronine schrieb:
Ich vermute, dass Deine Funktion einen Bug enthält, da mein Compiler einen Fehler gemeldet hatte.
Wie heißt der Fehler?
Warum speicherst du das überhaupt als unsigned short array ab?
-
_matze schrieb:
Dynamische Dateinamen kriegst du hin, indem du vor fopen einen String zusammenbastelst und diesen dann einfach an fopen übergibst. Da kannst du dann mit sprintf natürlich auch deine Platzhalter benutzen, wue du es direkt in fopen versucht hast.
#include <stdio.h> #include <limits.h> #include <string.h> #include <stdlib.h> #include <time.h> main() { unsigned short pwLaenge, StrLaenge, ZufallsZahl, i, puffer[USHRT_MAX], j, k; char Zeichensatz[]="!\\\"%&/()[]{}\?=\’#+*~–_.:;,|<>^0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"; char DynFileName[100]; FILE *datei; StrLaenge = strlen(Zeichensatz); srand(time(NULL)); k = 0; do { DynFileName[11]="PWGen*.txt"; DynFileName[5]=k; datei = fopen(DynFileName, "w+"); if(datei == NULL) { printf("Datenstrom konnte nicht geoeffnet werden.\n"); exit(0); } do { printf("Gewuenschte Passwortlaenge eingeben (MAXIMUM LENGTH: %i): ", USHRT_MAX); do{scanf("%hu", &pwLaenge);}while(getchar() != '\n'); printf("\n"); } while(pwLaenge > USHRT_MAX || pwLaenge <= 0); for(i=0; i <= pwLaenge-1; i++) { ZufallsZahl = (rand()%StrLaenge)-1; puffer[i] = Zeichensatz[ZufallsZahl]; } for(j=0; j <= pwLaenge-1; j++) { printf("%c", puffer[j]); fprintf(datei, "%c", puffer[j]); } printf("\n\nEine Datei namens GenPW%hu wurde im Ordner erzeugt.", k); k++; fclose(datei); printf("\n\nProgramm fortfahren mit [Enter] und Programm beenden mit [b].\n"); } while(getchar() != 'b'); exit(0); }
Compiler warnt:
warning: assignement makes integer from pointer without a cast
Zeile 25MfG, bashzeronine :p
-
Big Brother schrieb:
Wie heißt der Fehler?
Endlosschleife
Warum speicherst du das überhaupt als unsigned short array ab?
Meinst Du überhaupt? Macht das Programm mehr portabler, da int einen Systemspezifischen Wertebereich aufzeigt.
MfG, bashzeronine :p
-
@Big Brother
Und die anderen Fehler in deinem Programm:
In function 'cb'
error 'stdin' undeclared (first use this function)
(Each undeclared . . .usw. sind ca. 14 insgesamt
MfG, bashzeronine :p
-
bashzeronine schrieb:
1. Ich möchte dynamische Dateinamen während der Laufzeit erzeugen, folgendes ist nicht erlaubt (Zeile 23):
datei = fopen(k,"GenPW%hu.txt", "w+");
Kein Wunder. Bau den Dateinamen vorher mit sprintf zusammen, bendenke das nicht alle Zeichen für einen Dateinamen zulässig sind.
bashzeronine schrieb:
2. Gibt es eine alternative zu:
system("title Titel");
Grund: Ich möchte mein Programm möglichst portabel machen.
Bedingte Kompilierung ( #ifdef ).
bashzeronine schrieb:
3. Macht Zeile 26 - 31 Sinn?
MfG, bashzeronine :pBedingt. Guck mal die Zeile davor an: DynFileName[11]="PWGen*.txt";
Mach das Sinn? Nein. Du versuchst einen String in ein Zeichen reinzuquetschen.Macht das Sinn, die Datei ständig zu öffnen und zu schließen? Nein. Einmal öffnen und schließen reicht.
-
bashzeronine schrieb:
@Big Brother
Und die anderen Fehler in deinem Programm:
In function 'cb'
error 'stdin' undeclared (first use this function)
(Each undeclared . . .usw. sind ca. 14 insgesamt
MfG, bashzeronine :p
Du musst auch die notwendigen Header einbinden. Probier einfach mal die folgenden:
#include <stdio.h> #include <limits.h> #include <string.h> #include <stdlib.h> #include <time.h>
Sollte es dann noch immer nicht funktionieren poste den aktuellen Code und alle Fehlermeldungen.
-
bashzeronine schrieb:
Meinst Du überhaupt? Macht das Programm mehr portabler, da int einen Systemspezifischen Wertebereich aufzeigt.
MfG, bashzeronine :pPortabler? Quark. Mach das als char und gut ist.
bashzeronine schrieb:
@Big Brother
Und die anderen Fehler in deinem Programm:
In function 'cb'
error 'stdin' undeclared (first use this function)
(Each undeclared . . .usw. sind ca. 14 insgesamt
MfG, bashzeronine :p
Musste die Headerdatei einbinden, inder stdin definiert ist. Bei mir läuft das ohne Fehler und ohne Endlosschleife.
-
bashzeronine schrieb:
char DynFileName[100]; DynFileName[11]="PWGen*.txt"; DynFileName[5]=k;
Ähm, NÖ!
Mit der Deklaration ezeugst du ein Array mit 100 chars. Das eignet sich hervorragend, um eine Zeichenkette mit einem Dateinamen unterzubringen. Aber
: Du kriegst eine Zeichenkette nicht in einem Element dieses Arrays unter, das hat nur Platz für ein Zeichen (abgesehen davon, dass hier versucht wird, die Adresse des Stringliterals zuzuweisen)! Sowas kannst du z.B. mit strcpy machen, oder eben mit sprintf, was in deinem Fall sinnvoller ist, da du den String dynamisch zusammenbasteln willst. Beispiel:
char DynFileName[100]; sprintf(DynFileName,"PWGen%d.txt",99); //in DynFileName steht nun "PWGen99.txt")
Statt dem Literal 99 kannst du natürlich auch was anderes - z.B. k - einsetzen. Der Platzhalter "%d" steht für einen integer-Wert, den du einfügen willst. Mehr zu der Funktion findest du in der Doku.
Du solltest dich mal ganz intensiv mit solchen Grundlagen beschäftigen. Am besten mit einem Buch oder Tutorial, dass alles ganz genau erklärt. So ein Rätselraten bringt dich ja nicht weiter.
-
Hatte noch nen Bug drin
So müsste es stimmen: buf[i] = chars[rand()%(sizeof(chars)-1)];
Hab noch die Eingabe abgesichert. Guggsu:#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <locale.h> enum {pwd_minlen = 6, pwd_maxlen=64}; void generate_password ( char* buf, int bufsiz, int len ) { int i; char chars[] = "0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"; memset ( buf, 0, bufsiz ); for ( i = 0; i < len; i++ ) buf[i] = chars[rand()%(sizeof(chars)-1)]; } int check_input ( char* buf ) { char* s = buf; int len = 0; while (*s) { if ( *s < '0' || *s > '9' ) { printf ( "Pfui! Illegales Zeichen gefunden: %c \n", *s ); return 0; } s++; } len = atoi (buf); if ( strlen(buf) > 2 || len > pwd_maxlen ) { puts ( "Passwort zu lang, Bruder!" ); return 0; } if ( len < pwd_minlen ) { puts ( "Passwort zu kurz, Bruder!" ); return 0; } return len; } void remove_newline ( char* s ) { char* p = strrchr(s, '\n'); if (p) *p = 0; } int main() { int i; int len = 0; char pwd[pwd_maxlen+1] = {0}; char buf[BUFSIZ+1] = {0}; char* locale = setlocale(LC_ALL, "german"); // Wir wollen Umlaute in der Konsole Anzeigen. srand((unsigned)time(NULL)); do { printf ( "Länge des Passworts eingeben (%d bis %d Zeichen): ", pwd_minlen, pwd_maxlen ); fgets ( buf, sizeof(buf), stdin ); remove_newline (buf); }while ( 0 == ( len = check_input(buf))); generate_password ( pwd, sizeof(pwd), len ); printf("Generiertes Passwort: %s\n", pwd); /* for ( i = 0; i<strlen(pwd); i++ ) printf("%2d %3d %c\n", i, pwd[i], pwd[i]); */ setlocale(LC_ALL, locale); // Konsole verlassen wie vorgefunden. return 0; }
-
Wow, danke _matze, Big Brother und der ganze Rest
Aber habt ihr da nich ne kleinigkeit vergessen?!
bashzeronine schrieb:
Mir sind 2 Bugs im Programm aufgefallen:
1. Es wird das Leerzeichen ausgegeben, obwohl im BasicZeichensatz[] kein Leerzeichen vorhanden ist.
2. Wenn ich die erwuenschte PW-Laenge z. B. 100 eingebe und dannach das erzeugte file (PWGen*) öffne ist der inhalt folgender:
愺䍇㐢乁玒鉰礬≊張佞圣湔筍剎陛甮䱏潉㭾圡⨩䝡㝃㴵橸㙇⍬╃䙟之畦㍾唶搾䑟吸⽹嵩⩲䵕筡.㔰䱑欷筁䰲䬪昹
Obwohl im Programm also in Zeile 52 etwas anderes ausgegeben wird.
MfG, bashzeronine :p
MfG, bashzeronine :p
-
PW Länge 100?
Kommt nicht in die Tüte.
BasicZeichensatz? Wassn das?