MST

星途 面试题库

面试题:Rust进制转换控制台输出的泛型与错误处理

使用Rust的泛型特性,编写一个可以处理不同整数类型(如i32、u64等)的进制转换函数,支持从任意进制转换到任意进制,并将结果通过控制台输出。需要完善的错误处理机制,例如输入的源进制或目标进制不合法、输入数字超出类型范围等情况。
23.1万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use std::num::{ParseIntError, TryFromIntError};

fn convert_base<T: std::fmt::Display>(num_str: &str, from_base: u32, to_base: u32) -> Result<(), ConversionError> {
    if from_base < 2 || from_base > 36 || to_base < 2 || to_base > 36 {
        return Err(ConversionError::InvalidBase);
    }

    let num: i128 = match num_str.parse::<i128>() {
        Ok(n) => n,
        Err(e) => {
            return Err(ConversionError::ParseError(e));
        }
    };

    if num < i128::MIN || num > i128::MAX {
        return Err(ConversionError::OutOfRange);
    }

    let converted_num = match T::try_from(num) {
        Ok(n) => n,
        Err(e) => {
            return Err(ConversionError::TryFromError(e));
        }
    };

    let result = if num >= 0 {
        format!("{:b}", converted_num).replace("0b", "")
    } else {
        format!("-{:b}", -converted_num).replace("0b", "")
    };

    println!("Converted number: {}", result);
    Ok(())
}

enum ConversionError {
    InvalidBase,
    ParseError(ParseIntError),
    OutOfRange,
    TryFromError(TryFromIntError),
}

fn main() {
    let num_str = "10";
    let from_base = 10;
    let to_base = 2;

    match convert_base::<i32>(num_str, from_base, to_base) {
        Ok(_) => (),
        Err(e) => match e {
            ConversionError::InvalidBase => println!("Invalid base"),
            ConversionError::ParseError(e) => println!("Parse error: {}", e),
            ConversionError::OutOfRange => println!("Number out of range"),
            ConversionError::TryFromError(e) => println!("TryFrom error: {}", e),
        },
    }
}
  1. 函数定义与参数: convert_base 函数使用泛型 T,它接受三个参数:num_str 是需要转换的数字字符串,from_base 是源进制,to_base 是目标进制。
  2. 错误处理:
    • 检查源进制和目标进制是否在合法范围(2到36),如果不在,返回 ConversionError::InvalidBase
    • 使用 parse::<i128> 尝试将字符串解析为 i128,如果失败,返回 ConversionError::ParseError
    • 检查解析后的数字是否在 i128 的范围内,否则返回 ConversionError::OutOfRange
    • 使用 T::try_from 尝试将 i128 转换为泛型类型 T,如果失败,返回 ConversionError::TryFromError
  3. 进制转换: 这里简单将数字转换为二进制字符串作为示例,实际转换到任意进制需要更复杂的算法。
  4. 主函数: 主函数调用 convert_base 并处理可能返回的错误。