CodeRookie


私信TA

用户名:Shmily124

访问量:133755

签 名:

清风前烹茶对弈,明月下把酒言欢

等  级
排  名 14
经  验 23003
参赛次数 7
文章发表 39
年  龄 0
在职情况 学生
学  校 ZUA
专  业 计科

  自我简介:

悄悄地秃头,然后惊艳所有人?

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


解题思路:

首先我们要知道一个叫做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);
}
这个为什么不对啊
2023-08-09 11:14:29
输入输出用scanf和printf为什么达不到效果啊
2023-06-29 11:32:49
#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-01-25 16:12:28
这个很明显输入z之后咋翻译呢
2022-10-31 22:27:10
我这个就一直不行
不知道为什么
#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;
}
2022-05-08 10:39:32
nb这种才是原理,会了这个解决凯撒密码没有问题,重点的就只有那一句代码
2022-03-13 11:46:18
我的答案:
#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;
}
2022-02-26 15:59:16
#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;
}
2022-02-07 15:01:48