CS50 substitution程序密钥校验模块报错求助
CS50 Substitution作业密钥校验问题排查
我正在完成CS50课程的Substitution作业题,编写完代码编译后运行异常——即使输入正确的密钥,程序仍输出./substitution key提示信息。我推测问题出在密钥校验环节,但参考网络上的同类代码后仍未定位到错误,现将密钥校验相关代码附上,恳请帮忙排查问题。另外,我也觉得这门课程的作业难度较高。
原代码
#include <cs50.h> #include <stdio.h> #include <ctype.h> #include <string.h> int main(int argc, string argv[]) { if (argc != 2) { printf("Usage: ./substituion key\n"); return 1; } //validate the key! string key = argv[1]; for (int i = 0; i < strlen(key); i++) { if (!isalpha(key[i])) { printf("Usage: ./substitution key\n"); } } for (int j = 0; j < strlen(key); j++) { for (int k = 0; k < strlen(key); k++) { if (toupper(key[j]) == toupper(key[k])) { printf("Usage: ./substitution key\n"); return 1; } } } if (strlen(argv[1]) != 26) { printf("Usage: ./substituion key\n"); return 1; } }
问题排查与修复
你的密钥校验逻辑存在3个核心错误,导致程序误判:
- 非字母字符检查未终止程序:当发现密钥包含非字母字符时,仅打印提示但未执行
return 1退出,程序会继续执行后续校验流程,最终触发其他错误提示。 - 重复字符检查逻辑错误:双层循环中
k从0开始遍历,会让每个字符与自身比较(j == k时),无论密钥是否真有重复,都会直接触发重复判断并退出程序。应将k的起始值改为j + 1,只比较当前字符之后的字符。 - 密钥长度校验顺序错误:长度校验放在最后,若密钥长度不是26,前面的字母检查、重复检查都是无效操作,且可能导致后续逻辑出错。应优先校验密钥长度。
- 拼写错误:提示信息中的
./substituion少了字母t,应改为./substitution。
修正后的密钥校验代码
#include <cs50.h> #include <stdio.h> #include <ctype.h> #include <string.h> int main(int argc, string argv[]) { if (argc != 2) { printf("Usage: ./substitution key\n"); return 1; } string key = argv[1]; // 优先校验密钥长度必须为26 if (strlen(key) != 26) { printf("Usage: ./substitution key\n"); return 1; } // 校验密钥是否全为字母 for (int i = 0; i < strlen(key); i++) { if (!isalpha(key[i])) { printf("Usage: ./substitution key\n"); return 1; } } // 校验密钥是否有重复字符 for (int j = 0; j < strlen(key); j++) { // k从j+1开始,避免与自身比较 for (int k = j + 1; k < strlen(key); k++) { if (toupper(key[j]) == toupper(key[k])) { printf("Usage: ./substitution key\n"); return 1; } } } // 后续加密逻辑... return 0; }
内容的提问来源于stack exchange,提问作者learner_engineer7
相关产品推荐
相关产品推荐

