提示:文章
文章目录
- 前言
- 一、背景
- 二、
- 2.1
- 2.2
- 总结
前言
前期疑问:
本文目标:
一、背景
最近
# 二、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 1001void 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 1001bool 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
总结
未完待续