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

如何用C语言结合指针实现数字字符串中最频繁数字的计算?

用指针实现统计字符串中最频繁数字的完善方案

我来帮你搞定这个用指针实现的数字统计问题,你的代码已经有了雏形,只需要补上核心的统计逻辑和结果计算部分就行,咱们一步步来:

先梳理现有代码的问题

你的代码目前只做了字符串长度计数,没实际统计每个数字的出现次数;而且malloc出来的计数器数组没有初始化,会导致统计结果乱掉;最后也没有返回最终计算出的结果。

完善后的完整代码

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h> // 用于判断字符是否为数字

int most(char* string){ 
    // 为0-9共10个数字分配计数器数组内存
    int* counter_array = (int*)malloc(sizeof(int)*10);
    if (counter_array == NULL) { // 检查内存分配是否成功
        return -1; // 分配失败返回错误标识
    }
    
    // 用指针初始化计数器数组所有元素为0
    int* arr_ptr = counter_array;
    for (int i = 0; i < 10; i++) {
        *arr_ptr++ = 0;
    }
    
    // 用指针遍历字符串每个字符
    char* str_ptr = string;
    while (*str_ptr != '\0') {
        // 先判断当前字符是否是数字字符
        if (isdigit(*str_ptr)) {
            // 将字符转为对应的数字索引,比如'3'转成3
            int num_index = *str_ptr - '0';
            // 通过指针定位到对应计数器位置并累加次数
            *(counter_array + num_index) += 1;
        }
        str_ptr++; // 指针移动到下一个字符
    }
    
    // 找出出现次数最多的数字
    int max_count = 0;
    int most_freq_num = 0;
    arr_ptr = counter_array; // 重置数组指针到起始位置
    for (int i = 0; i < 10; i++) {
        if (*arr_ptr > max_count) {
            max_count = *arr_ptr;
            most_freq_num = i;
        }
        arr_ptr++; // 移动数组指针遍历下一个元素
    }
    
    free(counter_array); // 释放动态分配的内存,避免内存泄漏
    return most_freq_num;
}

// 测试示例
int main() {
    char nums[] = "132433423"; 
    printf("%d \n", most(nums)); // 输出3,符合预期
    return 0;
}

关键部分解释

  • 计数器数组初始化:用指针arr_ptr遍历数组,把每个元素设为0,避免未初始化的垃圾值干扰统计结果。
  • 字符串遍历逻辑:用str_ptr指针逐个访问字符串字符,判断是数字后,通过*str_ptr - '0'得到数字对应的数组索引,再用指针counter_array + num_index定位到对应计数器位置累加次数。
  • 查找最频繁数字:再次用指针遍历计数器数组,记录最大计数对应的数字索引(也就是数字本身)。
  • 内存管理:别忘了用free释放malloc分配的内存,养成良好的内存使用习惯。

测试验证

当调用most("132433423")时,数字3出现了4次,是所有数字中出现次数最多的,所以返回3,完全符合你的预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:54:18