2017-01-17 7 views
0

В настоящее время я работаю над шифром Vigenere в CS50 с использованием языка C. Требование состоит в том, чтобы создать программу, которая шифрует некоторый открытый текст на основе ключевого слова (оба из которых пользовательские входы). Он будет шифровать на основе шифрования Vigenere. Мне сложно описать словами, что такое шифр Vigenere, вот пример из спецификации CS50:CS50 PSet 2 - Vigenere - Обеспечение соответствия ключевого слова в алфавитном порядке

Если сам Vigenère хотел сказать HELLO кому-то конфиденциально, используя ключевое слово, скажем, ABC, он зашифровал бы H клавишей 0 (т. е. A), E с ключом 1 (то есть B) и первым L с ключом из 2 (т.е. C), после чего он был бы из букв в ключевом слове, и поэтому он повторно использовал (часть) его для шифрования второго L с ключом 0 (т. е. A) снова, а O с ключом 1 (т.е. B) снова. И поэтому он напишет HELLO как HFNLP.

Ключевое слово должно быть строкой всех алфавитных букв и должно указываться в качестве второго аргумента командной строки, то есть argv [1] в моем коде ниже. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу заставить программу отклонить ключ, если он не является алфавитным и продолжать, если он все алфавит. Я попытался сделать это так (см. Код ниже), и он не возвращает сообщение об ошибке printf, если я включаю число в argv [1]. Пожалуйста, может кто-нибудь предложить некоторые советы о том, что не так? Извинения, если формат не является большой ..

#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"); 
    } 
} 
} 

Я также попробовал, как это вместо того, что находится внутри цикл выше, и он не работает:

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

ответ

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

выходы как только появится алфавит в argv[1]. Вместо этого вы хотите продолжить цикл до все символы проверяются. Так, сделайте следующее:

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

Вы также должны поместить аргумент проверки перед тем использовать argv[1].

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

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

спасибо, что вам помогли :) Я, очевидно, не понял, что такое возвращение действительно. – joshkeisler95

+0

Я изменил инструкцию 'if', чтобы сразу не сломаться, когда обнаружил альфа-символ и немедленно сработал, когда есть символ не-альфа. В принципе, когда цикл завершается, 'argv [1]' прошел альфа-тест. – usr

+0

Извините еще одно - что такое size_t? – joshkeisler95