替换

要解决的问题

在替换密码中,我们通过把每个字母替换成另一个字母来“加密”(也就是以可逆的方式隐藏)一段消息。为此,我们会使用一个密钥:在本题中,密钥表示字母表中每个字母在加密时应该对应到哪个字母。若要“解密”消息,接收者需要知道这个密钥,才能反向执行这个过程:把加密后的文本(通常称为密文)还原成原始消息(通常称为明文)。

例如,密钥可以是字符串 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