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
相关产品推荐
相关产品推荐

