2016-07-12 13 views
-1

Ich besuche den Online-Kurs cs50 auf Edx und ich habe eine Aufgabe, in der ich ein Programm erstellen muss, wo der Benutzer ein Schlüsselwort eingibt (verwendet dann für die Verschlüsselung) und eine Zeichenfolge, die in Vigenere Chiffre verschlüsselt werden muss.Im letzten Teil eines Programms für die Verschlüsselung in Vigenere stecken

Vigenere arbeitet mit einem Text nach einem Stichwort Verschlüsselung: zum Beispiel, wenn meine Zeichenfolge „Hallo“ und mein Stichwort ist „abc“: a-0 in alphabetischen Zeichen gleich ist, b-1 und c-2; so dass der Buchstabe h in der Zeichenfolge verschlüsselt ist, ohne Zeichen zu wechseln (s Buchstabe a im Schlüsselwort is = 0), der Buchstabe e wird um eine Position geschaltet und ist verschlüsselt zu f, und so weiter. Wenn das Schlüsselwort eine Länge hat, die kleiner als die der Zeichenfolge ist (wie in diesem Fall), muss die Verschlüsselung das erste Zeichen des Schlüsselwortes erneut verwenden, und das ist mein Problem.

In der Tat, ich denke, ich habe das ganze Programm gut implementiert, aber ich bin mir nicht sicher, wie in Betracht zu ziehen, wenn ein Schlüsselwort weniger Zeichen als die Zeichenfolge eingegeben hat. Das Programm gibt jetzt nur das erste Zeichen meines Strings verschlüsselt und das erste Zeichen nicht verschlüsselt und dann stoppt es.
Ich bitte nicht um eine Komplettlösung, aber ich möchte nur verstehen, wie ich mein Programmproblem lösen kann.

Hier ist mein Programm:

#include <stdio.h> 
#include <cs50.h> 
#include <ctype.h> 
#include <stdlib.h> 
#include <string.h> 

int vigenere_low(char c) 
{ 
    int v = c - 'a'; 
    return v; 
} 

int vigenere_up(char c) 
{ 
    int v = c - 'A'; 
    return v; 
} 

int keyword_low(char c) 
{ 
    int k = c - 'a'; 
    return k; 
} 

int keyword_up(char c) 
{ 
    int k = c - 'A'; 
    return k; 
} 


int main(int argc, string argv[]) 
{ 
    string p; 
    string keyword = argv[1]; 

    if (argc != 2) 
    { 
     printf("Usage: ./vigenere keyword\n"); 
     return 1; 
    } 

    for (int i = 0, n = strlen(keyword); i < n; i++) 
    { 
     if (!isalpha(keyword[i])) 
     { 
      printf("Usage: ./vigenere keyword(alphabetical) \n"); 
      return 1; 
     } 
    } 

    p = GetString(); 
    int j = 0; 


    for (int i = 0, n = strlen(p); i < n; i++) 
    { 

     if (isalpha(p[i])) 
      { 


       if (islower(p[i])) 
       { 
       if (islower(keyword[j])) 
        { 
        int a = ((vigenere_low(p[i]) + keyword_low(keyword[j])) % 26) + 'a'; 
        printf("%c", a); 
        j++; 
        } 
        else 
        { 
        int a = ((vigenere_low(p[i]) + keyword_up(keyword[j])) % 26) + 'a'; 
        printf("%c", a);; 
        j++; 
        } 

       } 
       if (isupper(p[i])) 
       { 
       if (islower(keyword[j])) 
        { 
        int a = ((vigenere_up(p[i]) + keyword_low(keyword[j])) % 26) + 'A'; 
        printf("%c", a); 
        j++; 
        } 
       else 
        { 
        int a = ((vigenere_up(p[i]) + keyword_up(keyword[j])) % 26) + 'A'; 
        printf("%c", a); 
        j++; 
        } 

       } 
     else 
     { 
      printf("%c", p[i]); 
     } 



    } 

    return 0; 
    } 
} 
+0

Das erste, was ich bemerke, ist string keyword = argv [1] ;. Später rufen Sie n = strlen (Schlüsselwort) auf (was immer 1 ist), und Sie haben eine Menge if-Anweisungen in einem Schlüsselwort für die Schleifenprüfung [j]. Sollten Sie nicht die ganze Zeichenfolge im Schlüsselwort speichern? –

+0

@Shawn S 'string' ist wahrscheinlich' char * '. Warum sollte 'n = strlen (keyword)' immer 1 sein? – chux

+0

Post-Definition von 'GetString()'. Das ist keine Standardfunktion. – chux

Antwort

0

... nicht sicher, wie zu berücksichtigen, wenn ein Schlüsselwort weniger Zeichen hat als die Zeichenfolge eingegeben.

Zugriff auf keyword[j] über das Ende keyword[] hinaus ist schlecht. (Undefiniertes Verhalten). Dies passiert mit dem OP-Code, wenn der Schlüssel kürzer als der Alphateil der Nachricht ist.

Verwenden Sie einfach die Zeichenfolge keyword[] wie erforderlich. Hinweis: j zurücksetzen.

Maus über für Antwort.

int j_length = strlen (Schlüsselwort);
...
j ++;
wenn (j> = j_Länge) j = 0;