0

これは一部の人にとっては非常に単純な解決策のように思えるかもしれませんが、私はしばらくの間それを理解しようとしていて、私を悩ませていました.

int sum = (p[i] - 'A') + (s2[i % keyLen] - 'A');
 char c = 'A' + sum%26;

数学は私の得意分野ではありませんでした。と の場合、の値はchar c最後に 79 になるはずです。p[i]=72 or 'H's2[i]=5

この操作は素晴らしく機能しますが、何が起こっているのかを理解しようとしているので、通常の計算機で実行しようとしましたが、間違った答えを出し続けています. 操作の正しい順序と値はどうあるべきですか?

これまでに動作する完全なソースコードは次のとおりです。

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

int main(int argc, char *argv[])
{
    char s2[25];
    strcpy(s2, argv[1]);
    int keyLen = strlen(s2);
    printf("Please enter a string of text to be encrypted!\n");
    string p = GetString();
    for (int i = 0, n = strlen(p); i < n; i++)
    {
        if (isupper(p[i])){
        int sum = (p[i] - 'A') + (s2[i % keyLen] - 'A');
        char c = 'A' + sum%26;
        printf("%c", c);
        }
    }
    printf("\n");
    printf("%d\n", keyLen);

}

私がこの操作を行っている方法は次のとおりです。

int sum = (p[i] - 'A') + (s2[i % keyLen] - 'A');
//int sum = (72-65) + (72 % 5) - 65) sum= -56
char c = 'A' + sum%26;
//char c = 65 + -56 %26 char c = -8

私は自分の数学がオフであることを明らかに知っていますが、デバッガーsum = 14を介して操作を実行したときに正しく実行していると思っていchar c = 79 or 'O'ました。

4

1 に答える 1

3
int sum = (p[i] - 'A') + (s2[i % keyLen] - 'A');
//int sum = (72-65) + (72 % 5) - 65) sum= -56

あなたの誤解はここにあります。

コードの動作

(s2[i % keyLen] - 'A')

意味

(char_from_s2 - 'A')

ここで、 はindexのchar_from_s2文字、つまり文字列の長さに収まるように折り返された位置の文字です。s2i % keyLeni

あなたの計算が示すもの

あなたの計算は何か違うことをしています:

(char_from_p % keyLen) - 'A'

frompではなく from から文字を取得し、インデックスではなく文字値に演算子をs2適用しています。%

于 2012-10-19T15:41:20.360 に答える