发现好多题解都是授之鱼而不授之渔,属于应题代码,所以想写一个通用代码分享给大家
解题思路:
首先我们要知道一个叫做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 人评分
我这样也可以,只不过是根据这题直接初始化了 #include<stdio.h> int main() { char carry[5]={'C','h','i','n','a'}; int i; for(i=0;i<5;i++) { carry[i]+=4; } printf("%s",carry); return 0; }
为什么要定义数组11,定义数组为5不行吗?
/*要将"China"译成密码, 译码规律是:用原来字母后面的第4个字母代替原来的字母. 例如,字母"A"后面第4个字母是"E"."E"代替"A"。因此,"China"应译为"Glmre" 请编一程序,用赋初值的方法使cl、c2、c3、c4、c5五个变量的值分别为,’C’、’h’、’i’、’n’、’a’, 经过运算,使c1、c2、c3、c4、c5分别变为’G’、’l’、’m’、’r’、’e’,并输出。*/ #include <stdio.h> void main() { char c1, c2, c3, c4, c5; scanf("%c%c%c%c%c", &c1, &c2, &c3, &c4, &c5); c1 = c1 + 4; c2 = c2 + 4; c3 = c3 + 4; c4 = c4 + 4; c5 = c5 + 4; printf("%c%c%c%c%c\n", c1, c2, c3, c4, c5); }
谭响 2021-12-09 21:33:01 |
太细了
道九 2022-02-04 12:21:21 |
错误
can 2022-03-11 14:17:44 |
妙啊
stolen 2022-04-19 11:05:51 |
绝
Desire 2022-04-25 14:42:12 |
答案是对的但是有bug 吧
飒雨 2022-09-25 13:47:22 |
不得不说这样也可以。
吃猫的鱼 2022-09-25 20:09:20 |
漂亮
吃猫的鱼 2022-09-25 20:19:57 |
return 0;没写
24k纯铁 2022-10-23 16:02:20 |
肯定有bug
竜竜竜竜竜竜 2022-11-01 20:05:08 |
@uq_37571039557 这是void main
銱 2022-11-09 19:40:50 |
这个VWXYZ不能用啊。
老板,这代码多少钱一斤
废物,没个卵用
编译错误我麻了
赴日刘华强 2021-12-01 14:42:44 |
垃圾啊
赴日刘华强 2021-12-01 14:43:09 |
真TM的垃圾
随风 2021-12-09 11:10:52 |
编译错误可以把gets(s)改成gets_s(s)试试,部分VS编译器可能需要加_s来增加安全性
Auo 2021-12-22 21:34:08 |
自己调一下不久好了,啥都照搬
2rkeymjqmj 2022-02-26 11:10:09 |
把for判断条件中的i前面int去掉,在for上面用int定义一下i
s[i]=s[i]+4为什么还有一个-'A'
坚果吞噬者 2022-04-10 22:10:18 |
如果不减'A',在整除26的时候就会跳出'A'-'Z'这个范围,导致结果错误