0

私は C の初心者です。基本的な暗号を作成するために、アルファベット 'x' の文字を何度もシフトできるようにしたいと考えています。

islower() 関数に問題があります。「i」を使用していますが、文字に変更できません。

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

string p;

int main(int argc, string argv[])
{
    //if argument count does not equal 2, exit and return 1
    if (argc != 2)
    {
        printf("Less or more than 2 arguments given, exiting...\n");
        return 1;
    }
    else //prompt user for plaintext to encrypt
    {
        p = GetString();
    }

    //take the second part of the array (the int entered by user) and store as k (used as the encryption key)
    //string k = argv[1];
    int k = atoi(argv[1]);

    //function:
    // c = (p + k) % 26;    
    //iterate over the characters in the string
    //p represents the position in the alphabet of a plaintext letter
    //c likewise represents a position in the alphabet
    char new;
    for (int i = 0, n = strlen(p); i < n; i++)
    if (islower((char)i))
    {
        //printf("%c\n", p[i] + (k % 26));
        printf("This prints p:%s\n", p);
        printf("This prints i:%d\n", (char)i);
        printf("This prints k:%d\n", k);
        printf("This prints output of lower(i):%d\n", islower(i));
        new = (p[i] - 97);
        new += k;
        //printf("%d\n", new  %26 + 97);
        //printf("i = |%c| is lowercase\n", i);
        printf("%c\n", new % 26 + 97);
    }
    else {
        //printf("%c", p[i] + (k % 26));
        printf("This prints p:%s\n", p);       
        printf("This prints i:%d\n", (char)i);
        printf("This prints k:%d\n", k);
        printf("This prints output of lower(i):%d\n", islower(i));
        new = (p[i] - 65);
        new += k;
        //printf("%d\n", new % 26 + 65);
        //printf("i = |%c| is uppercase\n", i);
        printf("%c\n", new % 26 + 65);
    }
    printf("\n");
}

出力:

jharvard@appliance (~/Dropbox/CS50x/pset2): ./caesar2 1
zZ < here is my input
This prints p:zZ
This prints i:0
This prints k:1
This prints output of lower(i):0
G < here is fails, lower case z should move to lower case a
This prints p:zZ
This prints i:1
This prints k:1
This prints output of lower(i):0
A < here is a success! upper case Z moves to upper case A
4

2 に答える 2

2

英語のアルファベットは、ASCII で定義されているように C で使用されます。'Z' (ASCII 90) の後には '{' のみ (ASCII 91) が続きます。「A」に戻るには、次の方法ですべてのシフトを行う必要があります。

  1. ASCII 文字を 65 引きます。出力は 0 から 25 (両端を含む) になります。
  2. 変位(シフト距離)を追加します。
  3. モジュロ 26 を取り、結果をラップします。
  4. 再び 65 を追加します。

これは、英語の大文字のアルファベットに対してのみ機能することに注意してください。toupper()そのため、ctype.hライブラリから使用することをお勧めします。

小文字に同様の機能を追加する場合は、上記の手順を実行して、65 を 97 に置き換えます。小文字または大文字を取得したかどうかを確認するには、isupper(). 特殊文字用にさらに具体的なコードを追加する必要があります。

于 2014-03-05T20:19:39.290 に答える