提示:文章
文章目录
前言
前期疑问:
本文目标:
一、背景
最近
# 二、HJ29 字符串加解密
2.1 题目 对输入的字符串进行加解密,并输出。
加密方法为:
当内容是英文字母时则用该英文字母的后一个字母替换,同时字母变换大小写,如字母a时则替换为B;字母Z时则替换为a;
当内容是数字时则把该数字加1,如0替换1,1替换2,9替换0;
其他字符不做变化。
解密方法为加密的逆过程。
数据范围:输入的两个字符串长度满足 1 \le n \le 1000 \1≤n≤1000 ,保证输入的字符串都是只由大小写字母或者数字组成
输入描述:
第一行输入一串要加密的密码
第二行输入一串加过密的密码
输出描述:
第一行输出加密后的字符
第二行输出解密后的字符
示例1
输入:
abcdefg
BCDEFGH
复制
输出:
BCDEFGH
abcdefg
2.2代码
2.2.1 第一版有错误版
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <assert.h>
#include <stdbool.h>
#define STR_ARRAY_LEN 1001
void encodeStr(char* str)
{
int len = strlen(str);
for(int i = 0; i < len; i++)
{
if(isalpha(str[i]))
{
if(str[i] == 'z')
{
str[i] = 'a';
str[i] = toupper(str[i]);
}
else
{
str[i] = toupper(str[i] + 1);
}
}
else if(isdigit(str[i]))
{
if(str[i] == '9')
{
str[i] = '0';
}
else
{
str[i] = str[i] + 1;
}
}
else
{
printf("input error!");
assert(true);
}
}
}
void decode(char* str)
{
int len = strlen(str);
for(int i = 0; i < len; i++)
{
if(isalpha(str[i]))
{
if(str[i] == 'A')
{
str[i] = 'Z';
str[i] = tolower(str[i]);
}
else
{
str[i] = tolower(str[i] - 1);
}
}
else if(isdigit(str[i]))
{
if(str[i] == '9')
{
str[i] = '0';
}
else
{
str[i] = str[i] - 1;
}
}
else
{
printf("input error!");
assert(true);
}
}
}
int main()
{
char str[1001] = {'\0'};
while(fgets(str, STR_ARRAY_LEN, stdin) != NULL)
{
strtok(str, "\n");
encodeStr(str);
printf(str);
printf("\n");
fgets(str, STR_ARRAY_LEN, stdin);
strtok(str, "\n");
decode(str);
printf(str);
printf("\n");
}
return 0;
}
用例输入
2OA92AptLq5G1lW8564qC4nKMjv8C
B5WWIj56vu72GzRja7j5
预期输出
3pb03bQUmR6h2Mx9675Rd5OlnKW9d
a4vvhI45UT61fYqIZ6I4
实际输出
3PB03BQUMR6H2MX9675RD5OLNKW9D
a6vvhi67ut83fyqi`8i6
2.2.2
修改版
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <assert.h>
#include <stdbool.h>
#define STR_ARRAY_LEN 1001
bool isUpperDigit(char c)
{
if(c >= 'A' && c <= 'Z')
{
return true;
}
return false;
}
void alphaTransOfEncode(char* c)
{
if(isUpperDigit(*c))
{
if(*c == 'Z')
{
*c = 'A';
*c = tolower(*c);
}
else
{
*c = tolower(*c + 1);
}
}
else
{
if(*c == 'z')
{
*c = 'a';
*c = toupper(*c);
}
else
{
*c = toupper(*c + 1);
}
}
}
void alphaTransOfDecode(char *c)
{
if(isUpperDigit(*c))
{
if(*c == 'A')
{
*c = 'Z';
*c = tolower(*c);
}
else
{
*c = tolower(*c - 1);
}
}
else
{
if(*c == 'a')
{
*c = 'z';
*c = toupper(*c);
}
else
{
*c = toupper(*c - 1);
}
}
}
void DigitTransOfEncode(char* d)
{
if(*d == '9')
{
*d = '0';
}
else
{
*d = *d + 1;
}
}
void DigitTransOfDecode(char* d)
{
if(*d == '0')
{
*d = '9';
}
else
{
*d = *d - 1;
}
}
void encodeStr(char* str)
{
int len = strlen(str);
for(int i = 0; i < len; i++)
{
if(isalpha(str[i]))
{
alphaTransOfEncode(&str[i]);
}
else if(isdigit(str[i]))
{
DigitTransOfEncode(&str[i]);
}
else
{
printf("input error!");
assert(true);
}
}
}
void decode(char* str)
{
int len = strlen(str);
for(int i = 0; i < len; i++)
{
if(isalpha(str[i]))
{
alphaTransOfDecode(&str[i]);
}
else if(isdigit(str[i]))
{
DigitTransOfDecode(&str[i]);
}
else
{
printf("input error!");
assert(true);
}
}
}
int main()
{
char str[1001] = {'\0'};
while(fgets(str, STR_ARRAY_LEN, stdin) != NULL)
{
strtok(str, "\n");
encodeStr(str);
printf(str);
printf("\n");
fgets(str, STR_ARRAY_LEN, stdin);
strtok(str, "\n");
decode(str);
printf(str);
printf("\n");
}
return 0;
}
这一版ac了,也是调试了好几次,主要是细节处理比较多
##2.3 报错
Equality comparison result unused (fix available)
百度解释:编译器在进行等式比较时,比较的结果没有被使用
这是因为在写赋值语句的时候,将赋值符号写成了等于判断符号。
如下代码
void encodeStr(char* str)
{
int len = strlen(str);
for(int i = 0; i < len; i++)
{
if(isalpha(str[i]))
{
if(str[i] == 'z')
{
str[i] == 'a';
str[i] = toupper(str[i]);
}
else
{
str[i] = toupper(str[i] + 1);
}
}
else if(isdigit(str[i]))
{
if(str[i] == '9')
{
str[i] == '0';
}
else
{
str[i] = str[i] + 1;
}
}
else
{
printf("input error!");
assert(true);
}
}
}
三、
3.1
总结
未完待续