发现好多题解都是授之鱼而不授之渔,属于应题代码,所以想写一个通用代码分享给大家
解题思路:
首先我们要知道一个叫做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> main() { char c1='\0', c2 = '\0', c3 = '\0', c4 = '\0', c5 = '\0'; char c6, c7, c8, c9, c0; scanf_s("%c%c%c%c%c%c", &c1, &c2, &c3, &c4, &c5); c6 = c1 + 4; c7 = c2 + 4; c8 = c3 + 4; c9 = c4 + 4; c0 = c5 + 4; printf("%c%c%c%c%c", c6, c7, c8, c9, c0); } 这个为什么不对啊
#include<stdio.h> #include<string.h> int main() { char a[100],*p; printf("please enter a password you want to translate:\n"); gets(a); p = a; for(int i=0;*p!='\0';i++) { *p+=4; p++; } puts(a); return 0; }
既千里又百里 2023-04-13 20:05:31 |
char a后面给100有啥说法没,为我设5都可以正常运行
lingdu0403 2023-09-17 00:21:21 |
int main() { char ch[50]; printf("请输入一串待加密的英文:"); gets(ch); for (int i = 0; ch[i] != ' '; i++) { if (ch[i] == 32) continue; if (ch[i] + 4 >= 'a' && ch[i] + 4 <= 'z') ch[i] = ch[i] + 4; else if (ch[i] + 4 >= 'A' && ch[i] + 4 <= 'Z') { ch[i] = ch[i] + 4; } else ch[i] = ch[i] + 4 - 26; } puts(ch); return(0);
我这个就一直不行 不知道为什么 #include<stdio.h> int main() { int i; char letter[5]; printf("请输入字母"); for (i = 0; i < 5; i++) { scanf("%c", &letter[i]); } printf("%s\n", letter); for (i = 0; i < 5; i++) { if ((letter[i] >= 'A' && letter[i] < 'W') || (letter[i] >= 'a' && letter[i] < 'w')) { letter[i] = letter[i] + 4; } else if (letter[i] >= 'W' || letter[i] >= 'w') { letter[i] = letter[i] - 22; } } printf("密码为%s", letter); return 0; }
我的答案: #include<stdio.h> int main() { char data[5]; for(int i = 0;i<5;i++) { scanf("%c",&data[i]); data[i] += 4; } printf("%s\n",data); return 0; }
ddd 2022-03-26 19:08:05 |
这样子的话如果是wxyz 后移直接加4的话ASCII码值不能循环到前面的abcd
jhon 2022-04-18 14:50:53 |
为什么只能输5个,不能是变化长度的?
郁猪猪 2022-09-02 11:31:46 |
@ddd0501 是的
徐天育 2022-09-03 23:53:31 |
@jhonfrank 可以,在main函数下的第一行添加:const int N=? (备注:?代表字符串长度,想写多少写多少)
Joker 2022-10-12 15:08:54 |
@ddd0501 有这样的考虑是没问题,只是题目没这样要求,并且你想在wxyz后移循环到前面abcd也只是你想这么去实现
#include <stdio.h> int main( ) { unsigned int i = 4; int j = 0; char str[i]; gets( str ); while ( j++, j <= 5) { str[i] += 4; i--; } puts( str ); return 0; }
C语言程序设计教程(第三版)课后习题5.5 (C++代码)浏览:662 |
Hello, world! (C语言代码)浏览:995 |
C语言程序设计教程(第三版)课后习题7.3 (C语言代码)浏览:641 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:668 |
C语言训练-排序问题<2> (C++代码)浏览:936 |
2003年秋浙江省计算机等级考试二级C 编程题(2) (C语言代码)浏览:691 |
大家好,我是验题君浏览:604 |
C二级辅导-同因查找 (C语言代码)浏览:618 |
川哥的吩咐 (C语言代码)浏览:663 |
复数求和 (C语言代码)浏览:995 |
wz 2023-08-29 11:17:03 |
我改了两处:1. main -->int main 2.scanf_s-->scanf 在输入时:china 而不是c h i n a,中间没有一个空格 如此方可 但是我不知道为什么哈,新手
尼卡卡 2023-12-13 01:41:17 |
我补充一点你写了6个%c应该是5个