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

重写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:36:02