runtime error,数组改大无效,请教一下

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

很郁闷,runtime error数组改大,不起效果,问题应该在第一段代码

问题相关代码,请勿粘贴截图

#include
#include
int main()
{
char s[90];
int i=1,l=0;
s[0]=getchar();
while(s[i-1]!='\n'){
s[i]=getchar();
l++;
i++;
}

for(i=0;i
    if((s[i]>='a'&&s[i]<='y')||(s[i]>='A'&&s[i]<='Y')){
        s[i]++;
    }else if(s[i]=='z'||s[i]=='Z'){
        s[i]-=25;

    }
}

for(i=0;i
putchar(s[i]);

}
return 0;
}
密码翻译
描述:
在情报传递过程中,为了防止情报被截获,往往需要对情报用一定的方式加密,简单的加密算法虽然不足以完全避免情报被破译,但仍然能防止情报被轻易的识别。我们给出一种最简的的加密方法,对给定的一个字符串,把其中从a-y,A-Y的字母用其后继字母替代,把z和Z用a和A替代,其他非字母字符不变,则可得到一个简单的加密字符串。

输入:
输入一行,包含一个字符串,长度小于80个字符。
输出:
输出每行字符串的加密字符串。
样例输入:
Hello! How are you!
复制
样例输出:
Ifmmp! Ipx bsf zpv!


#include<stdio.h>

#include<string.h>

int main(void)

{

   int j,q,c=0;

   char a[20];

       gets(a);

     for(j=0;j<strlen(a);j++)

   {

     if((a[j]<='Z'&&a[j]>='D')||(a[j]<='z'&&a[j]>='d'))

        a[j]=a[j]-3;

        else if ((a[j]<='C'&&a[j]>='A')||(a[j]<='c'&&a[j]>='a'))

        a[j]=a[j]+23;

   }

for (q=strlen(a)-1;q>=0;q--)

    printf("%c",a[q]);

    printf("\n");

   return 0;

}

供参考:

#include <stdio.h>
#include <ctype.h>
int main()
{
    char s[80],ch;
    int i = 0;
    while((ch = getchar())!='\n' && i < 80){
          if(isupper(ch))
             ch = (ch - 'A' + 1)% 26 + 'A';
          else if (islower(ch))
             ch = (ch - 'a' + 1)% 26 + 'a';
          s[i++] = ch;
    }
    s[i] = '\0';
    printf("%s",s);
    return 0;
}

去掉if else 的写法:

#include <stdio.h>
#include <ctype.h>
int main()
{
    char s[80],ch;
    int i = 0;
    while((ch = getchar())!='\n' && i < 80){
          isupper(ch) ? s[i++] = (ch - 'A' + 1) % 26 + 'A' :
          islower(ch) ? s[i++] = (ch - 'a' + 1) % 26 + 'a' :
          s[i++] = ch;
    }
    s[i] = '\0';
    printf("%s",s);
    return 0;
}