替换
要解决的问题
在替换密码中,我们通过把每个字母替换成另一个字母来“加密”(也就是以可逆的方式隐藏)一段消息。为此,我们会使用一个密钥:在本题中,密钥表示字母表中每个字母在加密时应该对应到哪个字母。若要“解密”消息,接收者需要知道这个密钥,才能反向执行这个过程:把加密后的文本(通常称为密文)还原成原始消息(通常称为明文)。
例如,密钥可以是字符串 NQXPOMAFTRHLZGECYJIUWSKDVB。这个 26 个字符的密钥表示:A(字母表的第一个字母)应被转换为 N(密钥的第一个字符),B(字母表的第二个字母)应被转换为 Q(密钥的第二个字符),依此类推。
因此,像 HELLO 这样的消息会根据密钥确定的映射关系被加密为 FOLLE。
请在名为 substitution 的文件夹中创建 substitution.c 文件,并编写一个程序,使用替换密码加密消息。用户运行程序时,应通过命令行参数提供密钥;随后程序会用这个密钥加密运行时输入的秘密消息。
演示
规格说明
设计并实现一个名为 substitution 的程序,使用替换密码加密消息。
- 在名为
substitution的目录中,用名为substitution.c的文件实现你的程序。 - 你的程序必须接受一个命令行参数,也就是替换所使用的密钥。密钥本身应不区分大小写,因此密钥中的字符是大写还是小写不应影响程序行为。
- 如果程序运行时没有命令行参数,或提供了多于一个命令行参数,程序应使用
printf打印你选择的错误消息,并立即从main返回1(通常表示发生错误)。 - 如果密钥无效(例如不是 26 个字符、包含非字母字符,或没有且仅有一次包含每个字母),程序应使用
printf打印你选择的错误消息,并立即从main返回1。 - 你的程序必须输出
plaintext:(不换行),然后使用get_string提示用户输入一段明文字符串。 - 你的程序必须输出
ciphertext:(不换行),随后输出明文对应的密文。明文中的每个字母都应替换为密文中对应的字符;非字母字符应原样输出。 - 你的程序必须保留大小写:大写字母加密后仍应为大写字母,小写字母加密后仍应为小写字母。
- 输出密文后,应打印一个换行符。随后程序应从
main返回0并退出。
根据 manual.cs50.io,你可能会发现 ctype.h 中声明的一个或多个函数很有帮助。
讲解视频
如何测试
正确性
check50 cs50/problems/2026/x/substitution
如何使用 debug50
想运行 debug50 吗?在用 make 成功编译代码后,可以按如下方式运行:
debug50 ./substitution KEY
其中 KEY 是你作为命令行参数传给程序的密钥。请注意,运行
debug50 ./substitution
理想情况下会使程序结束,并提示用户需要提供密钥。
代码风格
style50 substitution.c
如何提交
在终端中执行以下命令提交你的作业,并按提示完成操作。
submit50 cs50/problems/2026/x/substitution