CS50x Leet转换程序中strlen()触发段错误的修复方法
问题分析与解决
核心错误原因
你遇到的段错误(segmentation error)根本原因不是字符串缺少NUL终止符,而是传入strlen()的是一个空指针:
- 命令行参数的索引规则是:
argv[0]是程序本身的名称,用户输入的第一个参数是argv[1] - 你的代码里调用
replace(argv[2]),但当用户按提示输入./no-vowels word时,argc的值是2,argv[2]并不存在,是一个空指针(NULL) strlen()无法处理空指针,直接访问会触发内存访问错误,也就是段错误
代码修正方案
只需要把main函数里的argv[2]改成argv[1],同时优化参数检查的条件(确保用户恰好传入一个参数):
string replace(string word); int main(int argc, string argv[]) { if (argc != 2) { printf("Usage: ./no-vowels word\n"); return 1; // 退出程序并返回错误码 } else { printf("%s", replace(argv[1])); } return 0; } string replace(string word) { int n = strlen(word); char vowel[4] = {'A', 'E', 'I', 'O'}; // 遍历字符串每个字符的逻辑 for (int i = 0; i < n; i++) { // 你的替换代码 } return word; }
额外说明
- CS50的
string类型本质是char*,命令行传入的参数本身是自动带NUL终止符的,不需要手动添加 - 当
argc < 2时,原来的代码没有退出程序,会继续执行后续逻辑,现在加上return 1可以避免这种无效执行
内容的提问来源于stack exchange,提问作者Mailbox
相关产品推荐
相关产品推荐

