CS50 PSET 2 Caesar错误结果

时间:2017-09-20 14:37:54

标签: c cs50 caesar-cipher

以为我已经完成了Caesar,但是在运行CHeck50时,我的代码因为这个原因而失败:加密" barfoo" as" yxocll"用23作为关键 输出无效的ASCII文本 日志 正在运行./caesar 23 ... 发送输入barfoo ... 检查输出"密文:yxocll" ...

有人能看到我的代码有什么问题吗?对于大写字母似乎工作得很好,但是使用小写字母和某些键,我会得到错误的结果,并且无法找出原因。任何帮助将不胜感激。

示例:如果我试图加密“foo”'使用17的密钥,它应该返回' wff',但我的代码正在返回' w'只要。根据我写的代码,它说要去128位不是字母的位置,但是我的代码然后说这是否超过122,扣除26.这等于并返回' 102', - 这是' f'。是否与删除被分配到127

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

int main(int argc, string argv[])
{
  if (argc == 2) {
    int a = atoi (argv[1]);
    int b = a%26;
    printf("plaintext: ");
    //get string
    string s = get_string();
    printf ("ciphertext: ");
        //iterate through string
        for (int i=0, n =strlen(s); i<n; i++) {
            //check if character is a letter
            if ( isalpha (s[i])) {
                //check if letter is uppercase
                if (isupper (s[i])) {
                    //calculate position of character in ASCI by adding 'Key'. If character is over 90, decrease character location by 26
                    char c = (s[i] + b);
                    if (c > 90) {
                            char d = c - 26;
                            printf ("%c", d);
                    } else
                    printf("%c", c);
                } else
               //For lowercase letters. If character location is over position 122, decrease location by 26
                {
                    char e = (s[i] + b);
                    if (e>122) {
                            char f = e - 26;
                            printf("%c", f);
                    } else
                        printf("%c", e);
                }
            } else    //print non letters with no change made
            {
                printf ("%c", s[i]);
            }
        }
    }
printf ("\n");
return 0;

}

1 个答案:

答案 0 :(得分:0)

使用小写字母,您可能会遇到溢出:

char e = (s[i] + b);

在您的系统上,char已签名,这意味着它可以取值-128到127.取小写的z,即ASCII 122.将它移动6位或更多,然后溢出你的char。有符号整数的溢出是未定义的行为。您可以通过设置中间值int s:

来解决此问题
int e = (s[i] + b);