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

C语言如何编写自定义my_strchr()函数及相关问题解析

C语言自定义my_strchr()函数实现答疑

参考实现代码

char *my_strchr(const char *src1, int c) {
    
    while (*src1 != '\0') { // 遍历到字符串末尾时跳出循环
        if (c == *src1) {
            return src1; 
        }
        src1++;
    }
    return NULL;     
}

疑问解答

1. 循环条件为什么用*src1 != '\0'?*src1是const char*类型指针吗?能不能直接用src1做判断条件?

  • 先明确两个变量的本质:src1本身才是const char*类型的指针,存储的是当前遍历位置的内存地址;*src1是对指针解引用后的结果,是当前地址存储的实际char类型字符值,不是指针。
  • C语言规范中,字符串以ASCII值为0的'\0'空字符作为结束标记,*src1 != '\0'的判断逻辑就是检查当前位置是不是字符串末尾,到末尾就停止遍历,避免越界访问非法内存。
  • 绝对不能直接用src1替代*src1做判断:src1存储的是内存地址,只要指针本身不是NULL,哪怕已经遍历到字符串结束符甚至越界到非法内存区域,这个地址值都不会为0,循环会一直跑下去,触发内存访问越界的未定义行为。

2. 返回操作、src1++自增操作为什么不对src1加*解引用?

  • src1++的操作目标是指针本身:我们遍历字符串的时候需要让指针每次向后移动1个char的长度,指向下一个字符,操作对象是指针变量本身,所以不需要解引用。如果写成(*src1)++,修改的是当前指针指向的字符值,完全达不到遍历的效果。
  • 返回逻辑同理:strchr函数的定义就是返回「匹配字符所在位置的指针」,返回值类型是char*,所以直接返回指针src1就符合要求,不需要解引用取字符值。

3. 为什么调用函数时会输出目标匹配字符之后的整段字符串,而非仅返回单个目标字符?

  • 这是C语言字符串的处理规则决定的:C语言没有原生字符串类型,所有字符串操作都基于char*指针和'\0'结束符实现。当你把函数返回的char*指针传给printf的%s占位符,或者其他标准字符串处理函数时,程序会从指针指向的内存位置开始逐字符读取,直到碰到'\0'才停止,自然就会输出从匹配字符开始到字符串末尾的全部内容。
  • 如果只想获取匹配到的单个字符,对返回的指针做解引用即可,比如char target = *my_strchr(test_str, 'c');,拿到的就是单个匹配字符。

内容的提问来源于stack exchange,提问作者mundanus1130

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.15 16:16:01