2017-01-17 3 views
0

Ich arbeite derzeit an der Vigenere-Chiffre in CS50 mit der Sprache C. Die Voraussetzung ist, ein Programm zu machen, das einige Klartext basierend auf einem Schlüsselwort verschlüsselt (beide die Benutzereingaben). Es wird verschlüsselt basierend auf der Vigenere-Chiffre. Ich finde es schwer in Worten zu beschreiben, was die Vigenere-Chiffre ist, hier ist ein Beispiel aus der CS50-Spezifikation:CS50 PSet 2 - Vigenere - Sicherstellen, dass das Schlüsselwort alphabetisch ist

Wenn Vigenère selbst zu jemandem vertraulich sagen wollte, mit einem Schlüsselwort von, sagen wir, ABC, er würde das H mit einem Schlüssel von 0 (dh A) verschlüsseln, das E mit einem Schlüssel von 1 (dh B) und das erste L mit einem Schlüssel von 2 (dh C), an diesem Punkt wäre er aus Buchstaben in dem Schlüsselwort, und so würde er es wiederverwenden (ein Teil davon), um das zweite L wieder mit einem Schlüssel von 0 (dh A) zu verschlüsseln, und das O mit einem Schlüssel von 1 (dh B) wieder. Und so würde er HELLO als HFNLP schreiben.

Das Schlüsselwort muss eine Zeichenfolge aus allen alphabetischen Buchstaben sein und muss als zweites Befehlszeilenargument angegeben werden, d. H. Argv [1] in meinem Code unten. Das Problem, das ich habe, ist, dass ich das Programm nicht dazu bringen kann, den Schlüssel abzulehnen, wenn es nicht alphabetisch ist, und fortzufahren, wenn es nur alphabetisch ist. Ich habe versucht, es so zu tun (siehe Code unten) und es gibt die printf Fehlermeldung nicht zurück, wenn ich eine Zahl in argv [1] einfüge. Kann mir bitte jemand Ratschläge geben, was falsch ist? Entschuldigt, wenn das Format nicht groß ..

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

// declare command line argument variables 
int main(int argc, string argv[]) 
{ 

string k = argv[1]; 

//return error if there aren't two command line arguments 
if (argc != 2) 
    { 
     printf("Usage: ./vigenere k\n"); 
     return 1; 
    } 

//make sure key is all alphabetical 
for (int i = 0; i < strlen(k); i++) 

{ 
    if(isalpha(k[i])) 
    { 
    return 0; 
    } 

    else 
    { 
    return 1; 
    printf("Please ensure all characters are alphabetical.\n"); 
    } 
} 
} 

Ich habe auch versucht, es so statt, was im Inneren der für Schleife oben und es hat nicht funktioniert:

if(!isalpha(k[i])) 
    { 
    return 1; 
    printf("Please ensure all characters are alphabetical.\n"); 
    } 

Antwort

1
if(isalpha(k[i])) 
    { 
    return 0; 
    } 

Ausfahrten das Programm sobald es ein Alphabet in argv[1] gibt. Stattdessen möchten Sie die Schleife fortsetzen, bis alle die Zeichen überprüft werden. Also, tun:

for (size_t i = 0; i < strlen(k); i++) 
{ 
    if(!isalpha(k[i])) 
    { 
    printf("Please ensure all characters are alphabetical.\n"); 
    return 1; 
    } 
} 

Sie müssen auch das Argument setzen Überprüfung vor Sie argv[1] verwenden.

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

string k = argv[1]; 
... 
+0

danke für die Hilfe :) Ich habe offensichtlich nicht verstanden, was die Rückkehr wirklich getan hat. – joshkeisler95

+0

Ich habe die 'if'-Anweisung so geändert, dass sie nicht sofort bricht, wenn sie ein Alpha-Zeichen findet und sofort fehlschlägt, wenn ein Nicht-Alpha-Zeichen vorhanden ist. Wenn die Schleife abgeschlossen ist, hat 'argv [1]' den Alpha-Test bestanden. – usr

+0

Sorry noch eine Sache - was ist size_t? – joshkeisler95

Verwandte Themen