如何在Rust中通过用户输入创建自定义大小数组?编译错误求助
问题原因与解决方法
Rust中固定大小数组[T; N]的长度N必须是编译时常量,你从用户输入获取的f_size是运行时才能确定的值,所以不能用来定义固定数组——这就是编译器报错的根本原因。
另外你的代码还有几个其他问题,一起修正如下:
修正后的完整代码
use std::io; use rand::Rng; fn main() { // 存储用户输入的数组大小 let mut max_key = String::new(); println!("Enter the desired size of your array:"); io::stdin().read_line(&mut max_key).expect("Failed to read input"); // 转换为usize(向量/数组长度的标准类型) let f_size: usize = max_key.trim().parse().expect("Please enter a valid number"); // 存储用户选择的操作 let mut command = String::new(); println!("Enter insert, remove, or find"); io::stdin().read_line(&mut command).expect("Failed to read input"); // 去除输入的换行符和空格,统一转为小写避免匹配问题 let command = command.trim().to_lowercase(); // 调用函数处理数组和操作 array_set(f_size, command); } fn array_set(size: usize, command: String) { let mut rng = rand::thread_rng(); // 用动态向量(Vec)替代固定数组,支持运行时确定长度 let mut arr = vec![0; size]; // 填充前半部分为随机整数 for i in 0..size/2 { arr[i] = rng.gen_range(i32::MIN..i32::MAX); } // 根据用户命令执行对应操作 match command.as_str() { "insert" => { let num = rng.gen_range(i32::MIN..i32::MAX); arr.push(num); println!("Inserted number: {}, array length now: {}", num, arr.len()); } "remove" => { if let Some(removed) = arr.pop() { println!("Removed number: {}, array length now: {}", removed, arr.len()); } else { println!("Array is empty, nothing to remove"); } } "find" => { let target = rng.gen_range(i32::MIN..i32::MAX); if arr.contains(&target) { println!("Number {} exists in the array", target); } else { println!("Number {} does not exist in the array", target); } } _ => println!("Invalid command, please enter insert, remove, or find"), } }
关键修正点说明
- 用
Vec替代固定数组:动态向量Vec是Rust中处理运行时可变长度集合的标准类型,支持根据用户输入的长度创建集合,还能直接执行插入、删除操作。 - 类型统一为
usize:集合的长度、索引都使用无符号整数usize,避免类型不匹配的编译错误。 - 修正元素填充逻辑:原代码的
arr.push(num)会在向量末尾追加元素,导致长度超出用户设定值,改为直接修改前半部分的索引位置,保证初始长度符合要求。 - 处理命令输入:去除输入中的换行符并转为小写,避免因输入格式问题导致命令匹配失败。
- 完善操作逻辑:通过
match语句实现了插入、删除、查找的基础功能框架,可根据需求进一步扩展细节。
内容的提问来源于stack exchange,提问作者user13508239
相关产品推荐
相关产品推荐

