任务描述
编程读入若干英文句子(不超过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的判断条件是个好地方来存放这个返回值。所以代码就出来了。

1071

被折叠的 条评论
为什么被折叠?



