Anel Geschrieben 31. Dezember 2010 Geschrieben 31. Dezember 2010 Hallo! Ich bin noch ein Anfänger in Sachen C/C++. Nun sollen wir ein Programm erstellen, das mit Hilfe der Vigenère-Methode Texte verschlüsselt. Das soll folgendermaßen funktionieren: Bei der Vigenère-Methode werden mehrere Schlüsselalphabete verwendet, die zur Verschlüsselung eines einzelnen Klartextbuchstabens dienen. So werden im folgenden Beispiel 16 Schlüsselalphabete verwendet: (hier: "wetter" ist das Schlüsselwort, die Buchstaben des Schlüsselworts werden 16 mal untereinander geschrieben und das Alphabet fort geführt; notfalls wird das Schlüsselwort so oft wiederholt, bis man 16 Buchstaben erhält) a b c d e f g h i j k l m n o p q r s t u v w x y z w x y z a b c d e f g h i j k l m n o p q r s t u v e f g h i j k l m n o p q r s t u v w x y z a b c d t u v w x y z a b c d e f g h i j k l m n o p q r s t u v w x y z a b c d e f g h i j k l m n o p q r s t u v w x y z a b c d e f g h i j k l m n o p q r s e f g h i j k l m n o p q r s t u v w x y z a b c d r s t u v w x y z a b c d e f g h i j k l m n o p q a b c d e f g h i j k l m n o p q r s t u v w x y z w x y z a b c d e f g h i j k l m n o p q r s t u v e f g h i j k l m n o p q r s t u v w x y z a b c d t u v w x y z a b c d e f g h i j k l m n o p q r s t u v w x y z a b c d e f g h i j k l m n o p q r s t u v w x y z a b c d e f g h i j k l m n o p q r s e f g h i j k l m n o p q r s t u v w x y z a b c d r s t u v w x y z a b c d e f g h i j k l m n o p q w x y z a b c d e f g h i j k l m n o p q r s t u v e f g h i j k l m n o p q r s t u v w x y z a b c d t u v w x y z a b c d e f g h i j k l m n o p q r s Dann codiert die Verschlüsselung den i-ten Buchstaben des Klartextes mit dem Buchstaben des i-ten Schlüsselalphabets, der dem Klartextbuchstaben zugeordnet ist. Man erhält so z.B. zu dem Klartext "Bin heute krank" den Geheimtext "xmg lvqxx oivrd". Nun die Aufgabenstellung: Erstellen Sie ein Programm für die Vigenère-Methode von Texten aus Kleinbuchstaben mit 16 Verschlüsselungsalphabeten, das nach Eingabe eines Funktionscodes (1 = Verschlüsseln, 2 = Entschlüsseln, sonst = Ende), eines Schlüsselworts (max. 9 Zeichen) und eines Klartextes (max. 99 Zeichen) bzw. eines Verschlüsselungstextes den Verschlüsselungstext bzw. den Klartext ausgibt. Mein Programm macht bisher folgendes: - es gibt zuerst ein leeres Quadrat aus - man gibt das Schlüsselwort ein (leider funktioniert das nur mit einem Schlüsselwort von mind. 6 Zeichen) - dann gibt es das Quadrat mit den Buchstaben aus - danach folgt die Eingabe des Funktionscodes (bisher konzentriere ich mich aufs Verschlüsseln - also Funktionscode = 1) - dann gibt es "Verschluesseln" aus - man gibt den Klartext ein (bisher noch ohne weitere Bearbeitung) - dann gibt es nochmals "Verschluesseln" aus (zur Kontrolle, dass das Programm in die Funktion "verschluesseln" geht) - eigentlich sollte die entsprechende Funktion dann die Länge des Klartextes ausgeben (zur Kontrolle) und den Verschlüsselungstext zurückgeben Aber es stürzt dort jedes mal ab! :confused: Also der Code sieht folgendermaßen aus: #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> char feld[19][26]; // mein Buchstabenfeld int i,j; // Zeile, Spalte des Feldes int main() { int code; // Funktionscode // Funktion für Verschluesselung char verschluesseln(char *schluesselwort, char *klartext); char schluesselwort[256], klartext[100], verschluesselungstext[100]; char entschluesseln(char *schluesselwort, char *verschluesselungstext); char ergebnis[100]; // Verschluesselungstext bzw. Klartext int ok; char eingabe_schluesselwort(); char eingabe_code(); char eingabe_verschluesselungstext(); char eingabe_klartext(); int feld_beschreiben(char *schluesselwort); // Alphabet darstellen int x = 97; // Asci-Code --> "a" // Schleife fuer Spalten, X-Achse for(j=0; j<25; j++) { feld[0][j] = x; printf("%c ", feld[0][j]); x++; } printf("\n"); // Inhalte des Feldes loeschen // Schleife fuer Zeilen, Y-Achse for(i=0; i<18; i++) { // Schleife fuer Spalten, X-Achse for(j=0; j<=24; j++) { feld[i][j] = '0'; printf("%c ", feld[i][j]); } printf("\n"); } ok = feld_beschreiben(schluesselwort); code = eingabe_code(); if (code == 1) { printf("Verschluesseln \n"); klartext[100] = eingabe_klartext(); ergebnis[100] = verschluesseln(*schluesselwort, klartext[100]); printf("Ergebnis = %c", ergebnis); } else if (code == 2) { printf("Entschluesseln"); } else { printf("Ungueltige Eingabe"); } return 0; } char eingabe_code() { int code; printf("Funktionscode eingeben: "); scanf("%i",&code); fflush(stdin); return code; } char eingabe_klartext() // In dieser Funktion bin ich mir nicht ganz sicher { // ob sie richtig ist char klartext[100]; printf("Klartext eingeben: "); fgets(klartext, 100, stdin); klartext[100] = malloc(strlen(klartext)+1); fflush(stdin); return klartext[100]; } char eingabe_verschluesselungstext() { char verschluesselungstext[100]; printf("Verschluesselungstext eingeben: "); gets(verschluesselungstext); fflush(stdin); return *verschluesselungstext; } char verschluesseln(char schluesselwort[256], char klartext[100]) { char ergebnis[100]; printf("Verschluesseln \n"); [COLOR="Red"]// ab hier hängt sich das Programm auf![/COLOR] //Zaehlende Schleife: int x; // x-ter Buchstabe des klartextes unsigned strlen(klartext); unsigned y; y = strlen(klartext); // Laenge des klartextes printf("Laenge des Klartextes: %i", y); for (x = 0; x < y; x++) { //Buchstaben vergleichen: while (klartext[x] != feld[i][0]) { i++; } //wenn Buchstaben gleich sind: if (klartext[x] == feld[i][0]) { ergebnis[x] = feld[i][1]; } } printf("Ergebnis = %c%c%c", ergebnis[0], ergebnis[1], ergebnis[2]); return *ergebnis; } char entschluesseln(char *schluesselwort, char *verschluesselungstext) { printf("Entschluesseln"); return 0; } int feld_beschreiben(char *schluesselwort) { int ok, i = 0; //Spalte static int j = 0; //Zeile char feld[19][26]; static int laenge = 0; //Laenge des Schluesselworts int h; //Zaehler wenn laenge kleiner 16 printf ("Schluesselwort mit mindestens 6 Zeichen: "); gets (schluesselwort); laenge = strlen(schluesselwort); //Laenge des Schluesselworts bestimmen printf ("Das Schluesselwort ist %u Characters lang.\n \n", laenge); // Schluesselwort hinschreiben if (laenge == 16) //Wenn die Laenge von schluesselwort maximal ist, { //schluesselwort ins Feld uebertragen for(i=0; i<18; i++) { feld[i][0] = schluesselwort[i-2]; } } else if (laenge >= 10) //Wenn schluesselwort zu lang ist, { //abbrechen printf("Bitte ein Schluesselwort mit maximal 9 Zeichen eingeben!\n"); return 0; } else //Wenn schluesselwort zu kurz ist { for (i=0; i<laenge+2; i++) //schluesselwort einmal hinschreiben { feld[i][0] = schluesselwort[i-2]; } i = laenge+2; h = laenge; while(h<(2*laenge+1)) // Solange max i nicht erreicht ist { // schluesselwort wiederholen feld[i][0] = schluesselwort[i-(laenge+2)]; i++; h++; printf("h = %i \n", h); } i--; if ((h = (2*laenge+1)) && (laenge*2 < 16)) // Wenn i immer noch nicht erreicht ist { while (h < 18) { // schluesselwort nochmals wiederholen feld[i][0] = schluesselwort[i-2*(laenge)-2]; i++; h++; printf("h = %i \n", h); } } } // Alphabet darstellen int x = 97; // Schleife fuer Spalten, X-Achse for(j=0; j<26; j++) { feld[0][j] = x; printf("%c ", feld[0][j]); x++; } printf("\n"); // Inhalte des Feldes darstellen // Schleife fuer Zeilen, Y-Achse for(i=2; i<18; i++) { // Schleife fuer Spalten, X-Achse for(j=0; j<26; j++) { if (i>1 && j>0) { feld[i][j] = feld[i][j-1] + 1; if (feld[i][j] > 122) { feld[i][j] = feld[i][j-1] - 25; } } else { feld[i][j] = feld[i][j]; } printf("%c ", feld[i][j]); } printf("\n"); } ok = 1; return ok; } Ich wäre euch sehr dankbar, wenn ihr mir sagen könntet, wo der Fehler ist. LG Anel Zitieren
Klotzkopp Geschrieben 31. Dezember 2010 Geschrieben 31. Dezember 2010 Du hast ein grundsätzliches Verständnisproblem bei der Verwendung von Arrays. Wenn du ein Array als char klartext[100] deklarierst, was ist dann klartext[0]? Beantworte das für dich selbst, bevor du weiterliest. Antwort: klartext[0] bezeichnet das erste Element des Array klartext. Was ist klartext[99]? Antwort: klartext[99] bezeichnet das 100. (und damit letzte) Element des Arrays klartext. Was ist klartext[100]? Antwort: klartext[100] wäre das 101. Element des Arrays klartext. Da dieses aber nur 100 Elemente hat, ist der Ausdruck ungültig. Du tust in deinem Code allerdings mehrfach so, als würde so ein Ausdruck plötzlich das ganze Array bezeichnen. Mit klartext[100] = irgendwas machst du keine Zuweisung an das ganze Array, genausowenig wie mit klartext[0] oder klartext[99]. Damit greifst du nur auf ein ungültiges Element zu. Man kann Arrays nichts zuweisen. Du musst die Elemente einzeln kopieren. Bei nullterminierten Strings kannst du strcpy benutzen. Zitieren
Anel Geschrieben 31. Dezember 2010 Autor Geschrieben 31. Dezember 2010 Ja, da hast du vollkommen recht, ich bin total verwirrt mit diesen Arrays, Zeigern, Reihungen, Feldern,... :confused: D.h. ich muss bei der deklaration anstatt klartext[100] klartext[99] schreiben und auch bei den anderen arrays dasselbe machen (also jedes mal dieses Nullzeichen nicht mit einbeziehen)... ok, das versteh ich noch aber was mache ich, wenn ich auf den gesamten array zugreifen will? Muss ich dann jedes mal eine zählende Schleife durchführen oder geht das dann mit Zeigern...? :confused: Zitieren
Klotzkopp Geschrieben 1. Januar 2011 Geschrieben 1. Januar 2011 D.h. ich muss bei der deklaration anstatt klartext[100] klartext[99] schreiben und auch bei den anderen arrays dasselbe machen (also jedes mal dieses Nullzeichen nicht mit einbeziehen)Nein. Ich habe jetzt im Detail nicht geprüft, ob deine Arrays groß genug sind, aber ich meinte nicht, dass du sie kleiner machen sollst. aber was mache ich, wenn ich auf den gesamten array zugreifen will? Muss ich dann jedes mal eine zählende Schleife durchführen oder geht das dann mit Zeigern...? :confused: Wie ich bereits sagte: Du musst die Elemente einzeln kopieren. Bei nullterminierten Strings kannst du strcpy benutzen. char-Array mit Nullterminierung -> strcpy Alles andere -> memcpy oder eine Schleife Zitieren
Anel Geschrieben 3. Januar 2011 Autor Geschrieben 3. Januar 2011 Ich habs! Ich weiß nicht, ob das umständlich ist oder so, aber es funktioniert! Also ich hab das jetzt folgendermaßen gemacht: (Ich hab u.a. die maximalen Werte als Konstanten deklariert, dass man nicht durcheinander kommt und ein paar Funktionen in die main-Funktion gepackt) #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #define MI 18 // maximales i, maximales j #define MJ 26 #define MT 99 // maximaler Text #define MW 9 // maximales Wort char feld[MI][MJ]; int i,j; // Zeile, Spalte des Feldes char schluesselwort[MW], klartext[MT], verschluesselungstext[MT]; char *p; // Zeiger der auf das Feld zeigt int main() { int code; //Funktionscode char ergebnis[MT] = {0}; char eingabe_code(); char feld_beschreiben(); // Alphabet darstellen int x = 97; // Asci-Code --> "a" // Schleife fuer Spalten, X-Achse for(j=0; j<25; j++) { feld[0][j] = x; printf("%c ", feld[0][j]); x++; } printf("\n"); // Inhalte des Feldes loeschen // Schleife fuer Zeilen, Y-Achse for(i=0; i<16; i++) { // Schleife fuer Spalten, X-Achse for(j=0; j<=24; j++) { feld[i][j] = '0'; printf("%c ", feld[i][j]); } printf("\n"); } p = feld_beschreiben(); code = eingabe_code(); if (code == 1) { int k; // Anzahl der Buchstaben des Klartextes printf("Verschluesseln \n"); printf("Wieviele Buchstaben hat der Klartext? "); scanf("%i", &k); for (i = 2; i <= k+1; i++) { j = 0; printf("%d. Buchstabe des Klartextes eingeben: ", i-1); fflush(stdin); scanf("%c", &klartext[i-1]); if ((klartext[i-1] >= 'a') && (klartext[i-1] <= 'z')) { while (klartext[i-1] != feld[0][j]) { j++; } ergebnis[i-2] = feld[i][j]; } else { ergebnis[i] = klartext[i]; } } printf("Loesung: "); for (i = 0; i < k; i++) { printf("%c", ergebnis[i]); } printf("\n"); } else if (code == 2) { printf("Entschluesseln \n"); int v; // Anzahl der Buchstaben des Verschlüsselungstextes printf("Wieviele Buchstaben hat der Verschluesselungstext? "); scanf("%i", &v); for (i = 2; i <= v+1; i++) { j = 0; printf("%d. Buchstabe des Verschluesselungstextes eingeben: ", i-1); fflush(stdin); scanf("%c", &verschluesselungstext[i-2]); if ((verschluesselungstext[i-2] >= 'a') && (verschluesselungstext[i-2] <= 'z')) { while (verschluesselungstext[i-2] != feld[i][j]) { j++; } ergebnis[i-2] = feld[0][j]; } else { ergebnis[i] = verschluesselungstext[i]; } } printf("Loesung: "); for (i = 0; i < v; i++) { printf("%c", ergebnis[i]); } printf("\n"); } else { printf("Ungueltige Eingabe"); } return 0; } char eingabe_code() { int code; printf("Funktionscode eingeben: "); scanf("%i",&code); fflush(stdin); return code; } char feld_beschreiben() { int i = 0; //Spalte static int j = 0; //Zeile static int laenge = 0; //Laenge des Schluesselworts int h; //Zaehler wenn laenge kleiner 16 printf ("Schluesselwort mit mindestens 6 Zeichen: "); gets (schluesselwort); laenge = strlen(schluesselwort); //Laenge des Schluesselworts bestimmen printf ("Das Schluesselwort ist %u Characters lang.\n \n", laenge); // Schluesselwort hinschreiben if (laenge == 16) //Wenn die Laenge von schluesselwort maximal ist, { //schluesselwort ins Feld uebertragen for(i=0; i<18; i++) { feld[i][0] = schluesselwort[i-2]; } } else if (laenge >= 10) //Wenn schluesselwort zu lang ist, { //abbrechen printf("Bitte ein Schluesselwort mit maximal 9 Zeichen eingeben!\n"); return 0; } else //Wenn schluesselwort zu kurz ist { for (i=0; i<laenge+2; i++) //schluesselwort einmal hinschreiben { feld[i][0] = schluesselwort[i-2]; } i = laenge+2; h = laenge; while(h<(2*laenge+1)) // Solange max i nicht erreicht ist { // schluesselwort wiederholen feld[i][0] = schluesselwort[i-(laenge+2)]; i++; h++; //printf("h = %i \n", h); } i--; if ((h = (2*laenge+1)) && (laenge*2 < 16)) // Wenn i immer noch nicht erreicht ist { while (h < 18) { // schluesselwort nochmals wiederholen feld[i][0] = schluesselwort[i-2*(laenge)-2]; i++; h++; //printf("h = %i \n", h); } } } // Alphabet darstellen char x = 'a'; // Schleife fuer Spalten, X-Achse for(j=0; j<26; j++) { feld[0][j] = x; printf("%c ", feld[0][j]); x++; } printf("\n"); // Inhalte des Feldes darstellen // Schleife fuer Zeilen, Y-Achse for(i=2; i<18; i++) { // Schleife fuer Spalten, X-Achse for(j=0; j<26; j++) { if (i>1 && j>0) { feld[i][j] = feld[i][j-1] + 1; if (feld[i][j] > 'z') { feld[i][j] = feld[i][j-1] - 25; } } else { feld[i][j] = feld[i][j]; } printf("%c ", feld[i][j]); } printf("\n"); } p = &feld[i][j]; return p; } Vielen Dank für deine Hilfe! P.S.: Ich hab eine Seite gefunden, auf der die Arrays und auch andere Sachen sehr schön erklärt sind: Galileo Computing :: C von A bis Z Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.