You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用指针在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 13:27:36