发现好多题解都是授之鱼而不授之渔,属于应题代码,所以想写一个通用代码分享给大家


解题思路:

首先我们要知道一个叫做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;
}


点赞(2)
 

0.0分

461 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 177 条评论

2328124210 1年前 回复TA
#include<stdio.h>
int main()
{
    char c1,c2,c3,c4,c5;
    scanf("%c%c%c%c%c",&c1,&c2,&c3,&c4,&c5);
    c1=getchar();
    c1=c1+4;
    c2=getchar();
    c2=c2+4;
    c3=getchar();
    c3=c3+4;
    c4=getchar();
    c4=c4+4;
    c5=grtchar();
    c5=c5+4;
    printf("%c%c%c%c%c\n"c1c2c3c4c5);
    return 0;
}
2328124210 1年前 回复TA
#include<stdio.h>
int main()
{
    char c1,c2,c3,c4,c5,;
    scanf("%c%c%c%c%c",&c1,&c2,&c3,&c4,&c5);
    c1=getchar();
    c1=c1+4;
    c2=getchar();
    c2=c2+4;
    c3=getchar();
    c3=c3+4;
    c4=getchar();
    c4=c4+4;
    c5=grtchar();
    c5=c5+4;
    printf("c1c2c3c4c5\n");
    return 0;
尼卡卡 1年前 回复TA
@酸角 我补充一点你写了6个%c应该是5个
小籽 1年前 回复TA
@KRWE 那个scanf函数里面的数组名后面加逗号和加个9是什么意思,有什么含义吗
龙炜 1年前 回复TA
@KRWE 如果输入的是倒数后面四个字符怎么办?
小半 1年前 回复TA
#include<stdio.h>
int main()
{
    char c[5]={'C','h','i','n','a'};
    
    int i=0;
    
    
    for(i=0;i<5;i++)
    {
        c[i]+=4;
        printf("%c",c[i]);
    }
	return 0;
}
Viper3 1年前 回复TA
@Viper3 我脑抽了 当我没说
Viper3 1年前 回复TA
请问%26这个符号如何前面的数小于26就没有用了吗
Silent 1年前 回复TA
@你说 在使用 scanf 读取字符时,会包含回车符。因此,在输入字母后按下回车键之后,回车符会被作为一个额外的字符保存到 letter 数组中。这可能会导致程序的输出不符合预期。  letter 数组的大小为 5,而输入的字符个数也是 5,但没有考虑到结尾的空字符 &#039;&#039;。因此,需要将 letter 数组的大小定义为 6 或更大,以容纳结尾的空字符。
小试牛刀 1年前 回复TA
这为什么只能运行前三个啊???我不理解
#include<stdio.h>
int main()
{
	char a[100];
	int i;
	for(i=0;a[i]!='\0';i++)
	{
	    a[i]=getchar();
	    if(a[i]<='v'&&a[i]>='a')
	    a[i]+=4;
	    if(a[i]<='V'&&a[i]>='A')
	    a[i]+=4;
	    if(a[i]>='v'&&a[i]<='z')
	    a[i]-=22;
	    if(a[i]>='V'&&a[i]<='Z')
	    a[i]-=22;
	}
	puts(a);
	return 0;
}