CS50 PSET2 Substitution替换密码运行出现Segmentation fault错误求助
问题根因
你触发段错误的核心原因是checker数组定义过小,发生栈越界访问:
- 你定义的
int checker[25];只能存储25个元素,下标范围为0~24 - 你输入的测试明文
The quick brown fox jumps over the lazy dog长度为43(包含空格),远大于25,遍历明文的过程中当s >= 25时,checker[s]访问了不属于数组的内存空间,直接触发段错误。
修复方案
- 首先修改checker数组的定义,长度和输入明文长度保持一致即可,对应代码修改为:
string input1 = get_string("plaintext: "); int checker[strlen(input1)]; // 按输入明文长度动态定义数组大小
- 额外修复一处逻辑漏洞:你当前代码先执行
string key1 = argv[1];再判断argc != 2,如果用户运行时没有输入密钥参数,会直接访问空指针argv[1]触发崩溃,建议调整逻辑顺序,先校验参数数量再赋值密钥:
// 调整顺序为先校验参数数量 if (argc != 2) { printf("Usage: ./substitution key\n"); return 1; } string key1 = argv[1]; // 参数合法后再读取密钥
- 你定义的
string input2 = input1;全程没有被使用,可以直接删除避免冗余。
修改完成后重新编译运行即可正常输出密文。
内容的提问来源于stack exchange,提问作者Naufal Alfa
相关产品推荐
相关产品推荐

