凯撒密文,无法运行。

问题遇到的现象和发生背景

给定一串字符,把其中每个大写字母变换成按顺序向后移N位的字母,遇到26个字母结束要环回到字母A计算顺序,其他字符不变。

问题相关代码,请勿粘贴截图
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果

【样例输入】

3
ABC123&*XYZ
【样例输出】

DEF123&*ABC

/*
凯撒密文
  本题测试点总结:
  ①输入的n值,需要对26取模,因为n的值有可能在26的绝对值之外;
  ②n值为负数或正数时,需要判断一下,如果小于0,则加上26,如果大于零,不要加上额外的26;
*/
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
    int n,i;

    char ch1[100]={0};

cin>>n;
gets(ch1);


    n = n%26;
    int len1 = strlen(ch1);
    for(i=0;i<len1;i++)
    {
        if(ch1[i]>='a'&&ch1[i]<='z')
        {
              if(n>=0) ch1[i] = ((ch1[i]-'a') + n)%26+'a';
            else if(n<0) ch1[i] = ((ch1[i]-'a') + n+26)%26+'a';
        }
        else if(ch1[i]>='A'&&ch1[i]<='Z')
        {
            if(n>=0) ch1[i] = ((ch1[i]-'A') + n)%26+'A';
            else if(n<0) ch1[i] = ((ch1[i]-'A') + n+26)%26+'A';
        }
    }
    ch1[i] = '\0';
    printf("%s",ch1);
    return 0;
}


/*
凯撒密文
  本题测试点总结:
  ①输入的n值,需要对26取模,因为n的值有可能在26的绝对值之外;
  ②n值为负数或正数时,需要判断一下,如果小于0,则加上26,如果大于零,不要加上额外的26;
*/
#include <stdio.h>

#define N 100

int main()
{
    int n;
    char a[N];
    scanf("%d", &n);
    n %= 26;
    if (n < 0)
        n += 26;
    scanf("%s", a);
    char *p = a;
    while (*p)
    {
        if (*p >= 'A' && *p <= 'Z')
            *p = 'A' + (*p - 'A' + n) % 26;
        p++;
    }
    printf("%s", a);
    return 0;
}

    cin >> n;
    getchar();
    gets(ch1);