移除else if条件后程序触发Segmentation fault的原因排查
问题排查:段错误及代码逻辑问题
首先,触发**Segmentation fault (core dumped)**的直接原因是你在else if分支中非法访问了argv[2]:
- 程序进入
else if分支时,说明前面的if (argc !=2 || ...)条件不成立,也就是argc ==2。而argv数组的有效索引范围是0到argc-1,此时argv[2]属于超出数组边界的内存,直接访问会触发段错误。
除此之外,代码还有多处语法、逻辑错误,逐个梳理:
1. else if分支的语法与逻辑问题
- 代码里的
else if (argc != 2 || is_valid_key(argv[2]) == 2))多了一个右括号),属于语法错误,编译阶段就应该报错。 - 逻辑完全冗余:前面的
if已经排除了argc !=2的情况,else if里再判断argc !=2没有意义,且此时argv[2]根本不存在。
2. is_valid_key函数的循环条件错误
函数第一个循环的条件:
for (i = 0; i < verify[i]; i++)
这是完全错误的写法——你把循环变量i和当前字符的ASCII值做比较(比如字符'A'的ASCII是65,i会一直递增到65才停止),会导致循环访问超出字符串长度的内存,大概率触发段错误。正确写法应该是遍历到字符串结束:
for (i = 0; verify[i] != '\0'; i++)
或者先获取字符串长度再循环:
int len = strlen(verify); for (i = 0; i < len; i++)
3. 验证逻辑的返回值与判断不匹配
你的is_valid_key返回值定义:
- 返回1:含非字母字符
- 返回2:长度不为26
- 返回3:存在重复字符
- 返回4:验证通过
但main函数里的判断逻辑完全混乱:
- 第一个
if里只要is_valid_key(argv[1]) ==1就输出通用用法提示,没有区分错误类型。 else if里判断返回值为2,却输出“必须只包含字母”的错误提示,完全不对应。
修复后的核心代码示例
#include <cs50.h> #include <stdio.h> #include <ctype.h> #include <string.h> int is_valid_key(string verify); int main(int argc, string argv[]) { // 先检查参数数量是否正确 if (argc != 2) { printf("Usage: ./substitution key\n"); return 1; } int key_status = is_valid_key(argv[1]); if (key_status != 4) { // 根据不同错误类型输出对应提示 switch(key_status) { case 1: printf("Key must only contain alphabetic characters.\n"); break; case 2: printf("Key must contain exactly 26 characters.\n"); break; case 3: printf("Key must contain no repeated characters.\n"); break; default: printf("Usage: ./substitution key\n"); } return 1; } string plain_text = get_string("plaintext: "); printf("%s\n", plain_text); } int is_valid_key(string verify) { int len = strlen(verify); // 先检查长度是否符合要求 if (len != 26) { return 2; } // 检查是否全为字母,同时统一转小写方便后续重复检查 for (int i = 0; i < len; i++) { char ch = verify[i]; if (!isalpha(ch)) { return 1; } verify[i] = tolower(ch); } // 检查是否存在重复字符 for (int a = 0; a < len; a++) { for (int b = a + 1; b < len; b++) { if (verify[a] == verify[b]) { return 3; } } } return 4; }
内容的提问来源于stack exchange,提问作者Sizwe
相关产品推荐
相关产品推荐

