重写C语言strrchr函数时输出字符串末尾出现多余字符问题求助
strrchr 复现问题修复方案
问题根因
- 缺少字符串结束符
\0:C 语言所有字符串操作(strlen、%s输出等)都以\0作为结束标记,你的new数组仅分配了原字符串长度的空间,存储完字符后没有手动追加\0,程序会读取数组后方的随机内存数据直到遇到\0,因此出现多余字符。 - 局部指针返回非法:
new是my_strrchr函数内的栈上局部变量,函数执行结束后该内存空间会被系统回收,返回该指针属于未定义行为,后续访问会出现不可预期的结果。 - 边界逻辑有瑕疵:未处理目标字符不存在的场景,且找到目标字符后将
i置0的逻辑会导致多遍历一次原字符串首字符。
基于原有逻辑的修复代码
#include <stdio.h> #include <string.h> #include <stdlib.h> char* my_strrchr(char* param_1, char param_2) { int str_len = strlen(param_1); int i = str_len - 1; int q = 0; // 多分配1字节存储'\0',使用malloc避免返回局部指针问题 char *new = malloc(str_len + 1); if (new == NULL) return NULL; char *new_ptr = new; int found = 0; while (i >= 0) { new[q] = param_1[i]; if (param_1[i] == param_2) { found = 1; break; // 找到后直接终止循环,避免多余遍历 } i--; q++; } if (!found) { free(new); return NULL; // 未找到目标字符返回NULL,符合标准库行为 } new[q + 1] = '\0'; // 手动追加字符串结束符 int size = strlen(new_ptr) - 1; // 反转字符串 for (int i = 0, q = size; i < q; i++, q--) { char temp = new_ptr[i]; new_ptr[i] = new_ptr[q]; new_ptr[q] = temp; } printf("%s\n", new_ptr); return new_ptr; } int main () { char *phrase = "C Language is HARD."; char c = 'g'; char *res = my_strrchr(phrase, c); // 使用完后手动释放malloc分配的内存 if (res != NULL) { free(res); } return 0; }
优化实现(符合标准库逻辑)
标准库strrchr不需要额外分配内存存储结果,直接从原字符串末尾向前遍历,找到匹配字符后直接返回原串对应位置的指针即可,逻辑更简洁无内存风险:
char* my_strrchr(const char* s, int c) { const char *p = s + strlen(s); do { if (*p == (char)c) { return (char*)p; } } while (p-- != s); return NULL; }
内容的提问来源于stack exchange,提问作者embarrassedAboutC
相关产品推荐
相关产品推荐

