PTA句子加密

任务描述
编程读入若干英文句子(不超过80字符,英文全大写,包括空格标点),
每个句子一行,加密后依次输出。

加密方式是字母替换法,26个英文字母分成2组,每组对应位置的字母互为替身,其它字符不变。
第1组字母:ABCDEFGHIJKLM
第2组字母:NOPQRSTUVWXYZ
eg.A与N互为替身,B与O互为替身,…,M与Z互为替身。

输入格式:
若干全大写英文句子,包括空格和标点。一个句子一行,不超过80个字符。

输出格式:
输出加密后句子,一个一行。

输入样例:
INT DOUBLE FOR WHILE RETURN

输出样例:
VAG QBHOYR SBE JUVYR ERGHEA

输入样例:
1.THEY LIVE UP IN THE MOUNTAINS.
2.WE SPENT A WEEK WALKING IN THE MOUNTAINS.
3.I WOKE UP IN THE MIDDLE OF THE NIGHT AND COULD HEAR A TAPPING ON THE WINDOW.

输出样例:
1.GURL YVIR HC VA GUR ZBHAGNVAF.
2.JR FCRAG N JRRX JNYXVAT VA GUR ZBHAGNVAF.
3.V JBXR HC VA GUR ZVQQYR BS GUR AVTUG NAQ PBHYQ URNE N GNCCVAT BA GUR JVAQBJ.

先放代码

#include<stdio.h>
#include<string.h>
void code(char *c){
    for(int i=0;i<strlen(c);i++){
        if(c[i]>='A'&&c[i]<='M')c[i]=c[i]+13;
        else if(c[i]<='Z'&&c[i]>='N')c[i]=c[i]-13;
    }
}
int main() {
    char m[80][80];
    int i=0;
    while(fgets(m[i],sizeof(m[i]),stdin)){
        code(m[i]);
        for(int j=0;j<strlen(m[i]);j++){
            if(m[i][j]!='.')printf("%c",m[i][j]);
            else printf("%c",m[i][j]);
        }
        i++;
    }
    return 0;
}

 由于我们有点大病的pta非常严格,对gets函数十分的不包容,认为gets是一个危险的函数,风险极大,所以用gets会出现报错。

#gets()的风险:gets()函数并不会根据数组的长度检测输入的值是否符合规范

#include<stdio.h>
int main(){
    char c[10];
    gets(c);
return 0;
}

 如此写,定义了一个长度为10 的数组c,但是实际我们用gets输入的时候可以发现能输入超过10 长度的内容,这就存在这数组越界的风险。

#fgets()函数的用法:fgets(*str,sizeof(*str),stdin)

人话一点就是数组名加长度加一个stdin,其中stdin意思是标准输入,更直白一点就是键盘输入。

##当然你学深一点就会发现除了stdin还可以是文件名,这个时候整个函数的意思就成了将文件的内容导入到数组里,下头是演示代码。

#include <stdio.h>
int main(){
   FILE *fp;
   char str[60];
   /* 打开用于读取的文件 */
   fp = fopen("file.txt" , "r");
   if(fp == NULL) {
      perror("打开文件时发生错误");
      return(-1);
   }
   if( fgets (str, 60, fp)!=NULL ) {
      /* 向标准输出 stdout 写入内容 */
      puts(str);
   }
   fclose(fp);
   return(0);
}

 回到题目,我们最后要注意的一点是fgets具有返回值,所以得给他找个地方,不然pta又报错了,

自然的while的判断条件是个好地方来存放这个返回值。所以代码就出来了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值