0
   #include <stdio.h>

int main()

{
    char msg[31] = {'\0'};
    char encrypted[31] = {'\0'};
    int key;


    printf("Please enter a message under 30 characters: ");
    fgets(msg, 31, stdin);

    printf("Please enter an encryption key: ");
    scanf("%d", &key);

    int i = 0;

    if (msg[i] && (('a' >= msg[i] && msg[i]>= 'z') || ('A' >= msg[i] && msg[i] >= 'Z')))
    {
        i++;
    } else {

    while (msg[i] && (('a' <= msg[i] && msg[i]<= 'z') || ('A' <= msg[i] && msg[i] <= 'Z')))
{
    encrypted[i] = (msg[i] + key);
    i++;
}
    }

    printf("%s\n", msg);
    printf("%d\n", key);
    printf("%s\n", encrypted);

}

コードが機能するようになりましたが、インクリメントで特殊文字とスペースを無視する方法がわかりません。また、% を使用して 'a' と 'A' にループバックし、メッセージ内のすべての大文字を同じに保つにはどうすればよいですか?

4

1 に答える 1

1

次のような範囲テストを行うことはできません。

'a' <= msg[i] <= 'z'

これは true または false (1 または 0) になると評価され'a' <= msg[i]、常に 未満です'z'

開始するには、次のものが必要です。

( msg[i] >= 'a' && msg[i] <= 'z' || msg[i] >= 'A' && msg[i] <= 'Z' )

これで、この条件をループに配置したので、特殊文字に遭遇するとすぐに終了します。文字に対して異なる動作をさせたい場合は、ループ内でチェックしてください。

for( i = 0; msg[i] != 0; i++ ) {
    if( msg[i] >= 'a' && msg[i] <= 'z' || msg[i] >= 'A' && msg[i] <= 'Z' ) {
        encrypted[i] = msg[i] + key;
    } else {
        encrypted[i] = msg[i];
    }
}

次に、質問の 2 番目の部分です。文字を回転させたいようです。これを試して:

// Sanity -- to avoid overflowing `char`
key %= 26;
while( key < 0 ) key += 26;

for( i = 0; msg[i] != 0; i++ ) {
    if( msg[i] >= 'a' && msg[i] <= 'z' ) {
        encrypted[i] = 'a' + ((msg[i]-'a' + key) % 26);
    } else if( msg[i] >= 'A' && msg[i] <= 'Z' ) {
        encrypted[i] = 'A' + ((msg[i]-'A' + key) % 26);
    } else {
        encrypted[i] = msg[i];
    }
}

暗号化された文字列に文字以外をまったく含めたくない場合は、別のインデックスを作成します。

int e = 0;

   encrypted[e++] = etc;  // Only when you want to add something to the string.

そして、ループの後に忘れないでください:

encrypted[e] = 0;   // terminate string.
于 2013-01-31T22:45:29.110 に答える