-1

私の目標は、Vigenere 暗号を作成することです。argv からキーを取得し、ユーザーから文字列を取得してから、作成した関数を介してメッセージとキーを渡し、それらを組み合わせて新しい値を返し、印刷することでこれを実行しようとしています。何らかの理由で、キーを印刷しているだけです。新しい関数と、戻り値をどのように使用しようとしているかに関係があると思います。コードは次のとおりです。

#include <stdio.h>
#include <stdlib.h>
#include <cs50.h>
#include <string.h>
#include <stdbool.h>
#include <ctype.h>
int new_crypt;
int encrypt(string , int );
int main(int argc, string argv[])
{
    if( argc != 2)
    {
        printf("Plese enter only one key");
        return 1;
    }

    string message = GetString();
    for(int i=0; i < strlen(message); i++)
    {
        int klen = strlen(argv[1]);
        //repeats the key until the message is over
        int key= argv[1][i%klen];
        bool kupper = isupper(key);
        bool klower = islower(key);
        bool kalpha = isalpha(key);
        if(kupper == true){
            //ASCII value of A is 65. 'A' = 0 shifts
            int k = key-65;
            int new_crypt = encrypt(message, k);
            printf("%c", new_crypt);
        }
        if(klower == true){
            //ASCII value of 'a' is 97. 'a' = 0 shifts
            int k = key- 97;
            int new_crypt = encrypt(message, k);
            printf("%c", new_crypt);
        }
        if(kalpha == false){
            int k = 0;
            int i = i-1;
            int new_crypt = encrypt(message, k);
            printf("%c", new_crypt);
        }

    }

    printf("\n");
    return 0;
}
int encrypt(string message, int k)
{
    for(int i=0; i < strlen(message); i++)
    {
        bool upper = isupper(message[i]);
        if(upper == true)
        {   //Makes sure the message doesnt go past 'Z'.. If it does it mod 90 it                                            /                   // and adds 65 ('A')
            int crypt = (message[i]+ k) % 90;
            if(crypt < 65)
            {
                int new_crypt = (crypt + 65);
                return new_crypt;
            }
            else{
                int new_crypt = crypt;
                return new_crypt;
            }
        }
        bool lower = islower(message[i]);
        if(lower == true)
        {
            int crypt = (message[i]+ k) % 123;
            if(crypt < 97)
            {
                int new_crypt = crypt + 97;
                return new_crypt;
            }
            else{
                int new_crypt = crypt;
                return new_crypt;
            }
        }
        bool alpha = isalpha(message[i]);
        if(alpha == false)
        {
            int new_crypt = message[i];
            return new_crypt;
        }
    }
    return 0;
}
4

1 に答える 1

1

関数内のループはまったく役に立ちません。これは、ループを終了させて​​制御を の呼び出し元に戻すステートメントがencryptなければ、ループ本体を通るパスがないためです。これにより、プログラムは全体として、メッセージの最初の文字をキーの連続する要素で繰り返し暗号化します。returnencrypt

これを回避する最も簡単な方法は、次の変更を加えることです

  • encrypt関数からループを削除します
  • 追加の引数として、暗号化するメッセージの要素を渡し、署名を作成します

    int encrypt(string message, int k, int i)
    

その他のコメント:

  • グローバル変数new_cryptはどこにも使用されていません。安心して取り外せます。(合理的に可能な限り、グローバル変数の使用を避ける必要があります)。
  • マジック ナンバーを使用する代わりに65、文字リテラルを使用することもできます'A'。これには、数値 65 を説明するコメントが不要であり、ASCII を使用しなくても常に大文字 A の正しい値であるという利点があります。(ただし、次の箇条書きも参照してください)
  • あなたのコードは、文字 A から Z (および a から z) が連続した値 (Z == A+26 など) を持っていることを前提としています。これは、ASCII エンコーディングの英語のアルファベットの場合に発生する可能性がありますが、他の言語のアルファベットまたはエンコーディングでは保証されていません。
于 2012-11-30T09:14:04.797 に答える