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

Rust统计字符串指定字符出现次数 find()仅返回首个匹配位置

Rust实现字符串指定字符出现次数统计

find()方法的设计逻辑就是仅返回第一个匹配项的索引,本身就不支持全量匹配计数,直接用它做次数统计不符合方法的设计预期,以下是可直接运行的正确实现:

实现代码

补全了原代码缺失的键盘输入逻辑,采用Rust最惯用的迭代器写法实现统计,兼容中文、emoji等多字节字符:

use std::fs;
use std::io;

fn main() {
    // 读取目标文本文件
    let data = fs::read_to_string("./Text").expect("文件读取失败,请检查./Text路径是否有效");

    // 读取键盘输入的待统计字符
    println!("请输入需要统计的字符:");
    let mut input_buf = String::new();
    io::stdin()
        .read_line(&mut input_buf)
        .expect("键盘输入读取失败");
    
    // 解析输入,自动去除输入末尾的换行符,取第一个有效字符作为统计目标
    let target = match input_buf.trim().chars().next() {
        Some(c) => c,
        None => {
            eprintln!("错误:未检测到有效输入字符");
            return;
        }
    };

    // 遍历字符迭代器,筛选匹配项后计数
    let occur_count = data.chars().filter(|&curr_char| curr_char == target).count();

    println!("字符 '{}' 的总出现次数为:{}", target, occur_count);
}

注意事项

  • 不要通过循环调用find()的方式实现计数:每次调用find()都会从指定位置重新扫描字符串,时间复杂度更高,性能远差于单次迭代遍历的写法。
  • 如果确定统计目标仅为ASCII字符,可以将字符遍历替换为字节遍历获得小幅性能提升,将计数逻辑替换为let occur_count = data.bytes().filter(|&b| b as char == target).count();即可,该写法不可用于多字节字符统计场景,否则会出现统计错误。

内容的提问来源于stack exchange,提问作者Phan Hoàng Long

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 19:39:17