发现好多题解都是授之鱼而不授之渔,属于应题代码,所以想写一个通用代码分享给大家
解题思路:
首先我们要知道一个叫做ASCII码表的东西,C语言的字符都是用ASCII码编写的
如果我们写一行这样的代码:
printf("%d\n", 'A');
将大写的 'A' 作为整形输出,会发现输出的结果是65,如果把 'A' 换成 'Z', 输出结果就会变成90
没错,其实每一个字符都是用一个数字来表示的,而且字符的排布是有序的,我们可以用字符来做比较甚至做运算
我们知道 'A' ==65, 'Z' ==90,那么我们想判断一个字符 ch 是否为大写字母的话,就可以这样写
if (ch >= 65 && ch <= 90)
或者不用数字,直接用字符做比较:
if (ch >= 'A' && ch <= 'Z')
同样的,判断小写字母就可以这样写:
if (ch >= 'a' && ch <= 'z')
判断语句写好了,接下来只需要将字母向后移动4位,但如果移动后的字符超过了字母 'Z' 或 'z' 该怎么办呢?
不必再使用分支,我们只需要将字符加4之后减去 'A' ( 或者 'a' ),然后对26取余,再加上 'A' ( 或者 'a' )
不太懂的话应该是这里没解释清楚:
字符加 4 就是后移的操作,减去 'A' 可以求出后移之后与 'A' 的距离
大写字母与 'A' 的距离应该为 0 ~ 25 ,但最后四个字母后移会超出这个范围
比如 'W' 后移 4 再减 'A' 变成了 26,超出了范围最大的 25,所以对 26 取余,就成了 0
0 就是 'W' 后移 4 之后与 'A' 真正的距离
此时拿这个距离再加上 'A' 就是后移之后真正的结果了,即 'A' ( 'W' 后移 4 位为 'A' )
小写字母同理
详细内容请看代码:
#include <stdio.h> int main() { char s[11]; //定义一个长度为10的字符串(注意有结尾符) gets(s); //输入字符串 for (int i = 0; s[i] != '\0'; i++) //循环到结尾符'\0'时停止循环 { if (s[i] >= 'A' && s[i] <= 'Z') //判断是否为大写字母 { s[i] = (s[i] + 4 - 'A') % 26 + 'A'; //大写字母后移 } if (s[i] >= 'a' && s[i] <= 'z') //判断是否为小写字母A { s[i] = (s[i] + 4 - 'a') % 26 + 'a'; //小写字母后移 } } puts(s); //输出字符串 return 0; }
0.0分
659 人评分
int main() { char c1 = 'C'; char c2 = 'h'; char c3 = 'i'; char c4 = 'n'; char c5 = 'a'; scanf("%c%c%c%c%c", &c1, &c2, &c3, &c4, &c5); printf("%c%c%c%c%c", c1 + 4, c2 + 4, c3 + 4, c4 + 4, c5 + 4); return 0; } 为什么我和大家都不一样
贺宏福 2021-11-22 20:30:00 |
??
贺宏福 2021-11-22 20:30:27 |
你这写的什么?
llc 2021-11-22 20:53:48 |
@jspi204407103 少了一个#include<stdio.h>
SHY 2021-11-25 14:25:51 |
你这个char中c定义常量了,下面的scanf就没用了。按你的意思应该这样写: char c1,c2,c3,c4,c5; 还有少了上一楼说的那串字符
twom 2021-12-03 21:04:59 |
简单粗暴
清水啊 2022-02-25 17:59:35 |
你这还要scanf干啥
#include<stdio.h> int main() { int t; while((t=getchar())!='\n') { printf("%c",t+4); } return 0; } 输出超限是为什么?
竜竜竜竜竜竜 2022-11-01 20:11:43 |
!=EOF
#include"stdio.h" int main() { char a; int i; for(i=1;i<=5;i++){ a = getchar(); a = a+4; printf("%c",a); } return 0; } 我这个也能过,请问有什么不足之处吗
原题中“用原来字母后面的第4个字母代替原来的字母”不够严谨,那请问大写Z后面第四个字母是多少?如果按照ASCII码应该是^,原题中应该在补充说明一下:对于后移4个字母期间超过最后一个字母Z时,则循环为A进行后移!
我这个代码都能过也是真的离谱 #include<stdio.h> int main() { printf("Glmre"); }
#include<stdio.h> int main() { str(11); gets(s) for(int i=0,s[i]!='\0',i++) { if(s[i]>='A'&&s[i]<='Z') { s[i]=(s[i]+4-'A')%26+'A'; } if(s[i]>='a'&&s[i]<='z') { s[i]=(s[i]+4-'a')%26+'a'; } puts(s); return 0; } 哪里有问题
#include<stdio.h> int main() { char c1='C',c2='h',c3='i',c4='n',c5='a'; c1='C'+4; c2='h'+4; c3+=4; c4+=4; c5+=4; printf("%c%c%c%c%c",c1,c2,c3,c4,c5); }
九宫重排 (C++代码)浏览:1410 |
C语言程序设计教程(第三版)课后习题10.7 (C语言代码)浏览:998 |
拆分位数 (C语言代码)浏览:1361 |
C语言程序设计教程(第三版)课后习题8.1 (C语言代码)浏览:1292 |
C语言训练-计算t=1+1/2+1/3+...+1/n (C语言代码)浏览:942 |
1642题解浏览:784 |
局部变量作函数返回值的问题浏览:1029 |
妹子杀手的故事 (C语言代码)浏览:1156 |
判定字符位置 (C语言代码)浏览:849 |
C语言程序设计教程(第三版)课后习题8.1 (C语言代码)浏览:765 |
困倦里说爱 2022-04-15 20:11:43 |
加一