发现好多题解都是授之鱼而不授之渔,属于应题代码,所以想写一个通用代码分享给大家
解题思路:
首先我们要知道一个叫做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 c[5]; for(int i=0;i<5;i++) { scanf("%c",&c[i]); c[i]=c[i]+4; if(c[i]>'Z' && c[i]<'a') { c[i]=c[i]-26; } if(c[i]>'z') { c[i]=c[i]-26; } } for(int i=0;i<5;i++) { printf("%c",c[i]); } }
for(i=0;s[i]!='\0';i++){ if(s[i]>='A'&&s[i]<='Z'){ if(s[i]+4>'Z'){ s[i]=s[i]-22; } else{ s[i]=s[i]+4; } } if(s[i]>='a'&&s[i]<='z'){ if(s[i]+4>='z'){ s[i]=s[i]-22; } else{ s[i]=s[i]+4; } } }
#include<stdio.h> int main() { char a; a = 0; while (a !=10) { a = getchar(); a = (a + 4); putchar(a); } 输出超限是什么意思啊??? return 0; }
熹声 2024-10-31 17:57:23 |
在ASCII表中,可打印字符的范围是从32(空格)到126(波浪号~)。如果增加4后的ASCII值超出了这个范围,那么输出的字符可能不是预期的字符,甚至可能是控制字符,这可能导致终端或控制台出现异常行为。
#include<stdio.h> int main() { char c1, c2, c3, c4, c5; c1 = 'C'; c2 = 'h'; c3 = 'i'; c4 = 'n'; c5 = 'a'; printf("%c%c%c%c%c", c1 + 4, c2 + 4, c3 + 4, c4 + 4, c5 + 4); } 简简单单吃个羊头
uq_32713838893 2024-03-17 19:41:53 |
哈哈我也是这样的看到大佬的才发现自己想的还是太少了
斗战胜佛卢卡斯 2024-04-13 16:32:33 |
所以这样的也可以吗?感觉比up的好懂一点,但是还是不太会
#include<stdio.h> int main() { char arr[10]; int i; int j; for (i = 0; i < 10; i++) { scanf("%c", &arr[i]); if (arr[i] == '\n') { break; } } for (j = 0; j < i; j++) { arr[j] += 4; printf("%c", arr[j]); } return 0; } 我结果是对的为啥提交说我是错的啊
#include<stdio.h> int main() { char c1,c2,c3,c4,c5; c1=getchar(); c2=getchar(); c3=getchar(); c4=getchar(); c5=getchar(); putchar(c1+4); putchar(c2+4); putchar(c3+4); putchar(c4+4); putchar(c5+4); putchar('\n'); return 0; }
int main() { char s[11]; gets(s); for (int i = 0; s[i]!= '\0'; i++) { s[i] = s[i] + 4; } puts(s); return 0; }
C语言训练-尼科彻斯定理 (C++代码)浏览:680 |
C语言程序设计教程(第三版)课后习题7.4 (C语言代码)浏览:489 |
C语言程序设计教程(第三版)课后习题10.2 (C语言代码)浏览:1056 |
C二级辅导-计负均正 (C语言代码)浏览:652 |
C语言训练-求s=a+aa+aaa+aaaa+aa...a的值 (C++代码)(手动优化一下计算)浏览:1366 |
简单的a+b (C语言代码)浏览:783 |
简单的a+b (C语言代码)浏览:594 |
成绩转换 (C语言代码)浏览:1048 |
C语言程序设计教程(第三版)课后习题6.10 (C语言代码)浏览:827 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:703 |