凯撒密码输出空行

Caesar cipher outputs blank line

我正在做 CS50 课程中的问题集,我们必须实施凯撒密码。以下代码仅适用于数字(它们与预期的一样),当您输入字符时,没有任何输出。怎么了?

#include <cs50.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
//problem set requires arguments
int main (int argc, string argv [])
{
    int i = 0;

    if (argc != 2){
        printf ("Retry\n");
        return 1;
    } else {
        int x = atoi(argv [1]);
        //gets plaintext
        string a = get_string ("plaintext:");
        printf("ciphertext:");
        for (i = 0; i <= strlen(a); i++){
            //if character is a number it remains unchanged
            if (isdigit(a[i])){
                printf ("%c", a[i]);
            } else {
                if (isupper(a[i])){
                    //converts from ASCII index to alphabetical index
                    char y = a[i] - 65;
                    //Caesar cipher formula. If upper case remains upper case.
                    y = toupper(a[i] + x % 26);
                    //goes back ASCII
                    printf("%c", y + 65);
                    } else if (islower(a[i])){
                    //converts from ASCII index to alphabetical index
                    char t = a[i] - 65;
                    //Caesar cipher formula. If lower case remains lower case.
                    t = tolower(a[i] + x % 26);
                    //goes back to ASCII
                    printf("%c", t + 65);
                    }
                }
           }
        }
}

65 是字母 'A' 的 ASCII 值。如果您正在处理小写单词,则需要 97,这是 'a'

的 ASCII 值

你已经计算了t,但是你没有把结果带到下一行。此外,您必须对整条线取模。您期望 t026 之间,然后将其添加到 97

char t = a[i] - 97;
t = (t + x) % 26;
printf("%c", t + 97);

for 循环也应该达到 strlen(a)。字符串 a 中的最后一个索引是空字符,不应修改。您也可以在此处使用 'a' 而不是 97

for(i = 0; i < strlen(a); i++)
{
    if(isupper(a[i]))   
    {
        char y = a[i] - 'A';
        y = (y + x ) % 26;
        printf("%c", y + 'A');
    }
    else if(islower(a[i])) 
    {
        char t = a[i] - 'a';
        t = (t + x )% 26;
        printf("%c", t + 'a');
    }
    else 
    {
        printf("%c", a[i]);
    }
}