使用指针在C语言中替换字符串字符时遇到的问题
问题分析与修复方案
你的思路方向是对的——找到最后一个/并替换为\0来截断路径,但代码里有两个关键问题直接导致了bus error:
1. 指针遍历的逻辑错误
你写的while (*url++)会先读取当前url指向的字符,再把url向后移动一位。紧接着的if (*url == '/')判断的是移动后的新位置的字符,这就导致你永远错过了当前正在检查的那个字符!
举个例子:假设url当前指向/,*url++会先读取这个/,然后url跳到下一个字符,这时候你判断的是下一个字符是不是/,完全没把当前这个/记录到last_slash里。结果就是真正的最后一个/永远不会被捕获,last_slash要么指向错误的位置,要么根本没被赋值。
2. 未处理无/的边界情况
如果传入的字符串里没有/,last_slash会是一个未初始化的野指针。这时候执行*last_slash = '\0'就会直接访问非法内存,触发bus error或者段错误。
修复后的代码
我们调整遍历逻辑,先检查当前字符再移动指针,同时初始化last_slash为NULL来处理边界情况:
void remove_filename(char *url) { char *last_slash = NULL; // 先检查当前字符,再移动指针 while (*url) { if (*url == '/') { last_slash = url; } url++; } // 只有找到/的时候才执行截断 if (last_slash != NULL) { *last_slash = '\0'; } }
额外说明
- 这样遍历的时候,每一个字符都会被检查到,确保
last_slash始终指向最后一个出现的/。 - 加入
last_slash != NULL的判断,避免在没有/的情况下操作野指针,程序会保持原字符串不变,更健壮。
内容的提问来源于stack exchange,提问作者Rein Van Imschoot
相关产品推荐
相关产品推荐

