数学运算有问题

时间:2012-10-19 15:35:44

标签: c cs50 vigenere

对于某些人来说,这似乎是一个非常简单的解决方案,但我一直试图弄清楚它已经有一段时间了,而且它让我烦恼。

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

我无法提出解决方案数学从未成为我的强项。如果char cp[i]=72 or 'H',则s2[i]=5的值应该等于79。

此操作非常有效,但我正在尝试了解发生了什么,所以我尝试使用普通计算器进行操作,并不断提出错误的答案。究竟什么是正确的操作顺序以及这些值应该是什么?

以下是我目前使用的完整源代码:

#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 = 14char c = 79 or 'O'运行操作时,我正在这样做。

1 个答案:

答案 0 :(得分: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')

其中char_from_s2s2中索引i % keyLen处的字符,即位置i处的字符缠绕以适合字符串的长度。

您的计算显示

您的计算正在做一些不同的事情:

(char_from_p % keyLen) - 'A'

您从p而不是s2获取角色,并将%运算符应用于字符值而不是索引。