1.题目要求
编写加密程序,将用户输入的一个英文句子加密为加密字符串,然后输出加密字符串。假设句子长度不超过50个字符。根据给定的句子加密函数原型SentenceEncoding,编写函数SentenceEncoding调用字符加密函数CharEncoding完成句子加密。然后,编写主程序提示用户输入英文句子,然后调用函数SentenceEncoding对句子加密,最后输出加密后的句子。字符加密规则为大写字母和小写字母均加密为其补码, 我们定义ASCII码值相加为’A’+’Z’即155的两个大写字母互为补码,ASCII码值相加为’a’+’z’即219的两个小写字母互为补码。空格用@代替,句号以#代替,其它字符用句点代替。 函数原型: void SentenceEncoding(char *soure,char *code); 功能:对待加密字符串source加密后保存加密字符串到code. 参数:char *soure,指向待加密句子的字符串指针;char *code 指向加密字符串的字符串指针;输入提示信息:"Input source sentence:" 输出提示信息:"Encoded sentence:" 输出加密字符串后,输出一个回车。运行实例1: Input source sentence:You are a student. Encoded sentence:Blf@ziv@z@hgfwvmg#
2.代码实现
#include<stdio.h>
#include<string.h>// 字符加密函数
char CharEncoding(char ch)
{char encode = 0;if (ch >= 'A' && ch <= 'Z') {encode = ('A' + 'Z') - ch; }else if (ch >= 'a' && ch <= 'z') {encode = 'a' + 'z' - ch; }else{switch (ch) {case ' ': encode = '@'; break; case '.': encode = '#'; break;default: encode = '.'; break;}}return encode;
}// 句子加密函数
void SentenceEncoding(char *source, char *code)
{while (*source!= '\0'){*code = CharEncoding(*source);source++;code++;}*code = '\0'; // 给加密后的字符串添加结束符
}int main()
{// 输入提示信息printf("Input source sentence:");char ch[80];// 使用 fgets 避免缓冲区溢出fgets(ch, sizeof(ch), stdin);ch[strcspn(ch, "\n")] = '\0';char code[80];// 输出提示信息printf("Encoded sentence:");SentenceEncoding(ch, code);puts(code);printf("\n");return 0;
}
3.代码详解
CharEncoding
函数:
- 如果
ch
是大写字母(A
到Z
),通过encode = ('A' + 'Z') - ch
计算其补码。 - 如果
ch
是小写字母(a
到z
),通过encode = 'a' + 'z' - ch
计算其补码。
SentenceEncoding
函数:
- 使用
while (*source!= '\0')
循环,只要source
指针未指向字符串结尾,就调用CharEncoding
函数对当前字符进行加密,并将结果存储在code
指针所指向的位置。 - 同时,将
source
指针和code
指针向后移动一位,继续处理下一个字符。 - 最后添加字符串结束符
'\0'
到加密后的字符串末尾。
处理多余的换行符:
strcspn
是 C 标准库中的一个函数,其函数原型为size_t strcspn(const char *str1, const char *str2);
。- 它的作用是计算
str1
中从起始位置开始,连续的字符都不在str2
中出现的字符的长度。 - 当
str2
是"\n"
时,strcspn(ch, "\n")
会计算ch
中从起始位置开始,连续的字符中不包含换行符'\n'
的字符的长度。
- 它的作用是计算