我是生锈的新手,作为一个选秀,我正在尝试做一个终端服务器的应用。在编写菜单选择部分时,我发现用于获取用户输入的字符串变量具有“加性行为”,即它不会用新值覆盖旧值,是否有一种无需使用不安全方法来刷新字符串的方法?
守则如下:
//Dependencies
use std::io::stdin;
use std::ffi::OsString;
fn main()
{
bifrost_menu();
}
fn bifrost_menu()
{
//mutable input string
let mut line = String::new();
let mut opt = String::new();
let mut _press = String::new();
loop
{
//Selection Menu
println!(" Bienvenido al menu de Bifrost");
//selection menu
println!("Elija una opcion :");
println!(" 1. Acceso a monitor de estado");
println!(" 2. Acceso a dispositivos");
println!(" 3. salir del menu");
//user input
stdin().read_line(&mut line)
.ok()
.expect("Fallo al ingresar opcion");
//trim aquired string
if opt.len() >1
{
opt.remove(0);
}
opt = trim_input (&mut line);
println!("{} witness print",opt);
match opt.as_str()
{
"1" => {heimdall_menu();},
"2" => {midgar_menu();},
"3" => {break},
_ => {println!("ERROR : por favor ingrese una opcion valida\nPresione cualquier tecla para continuar ...");
//user input
stdin().read_line(&mut _press)
.ok()
.expect("Fallo al ingresar opcion");},
}
opt = String::new();
}
}
fn heimdall_menu()
{
//mutable input string
let mut line = String::new();
//Selection Menu
println!(" Bienvenido al menu de Heimdall");
//selection menu
println!("Elija una opcion :");
println!(" 1. Reachability test");
println!(" 2. SNMP quick monitoring");
println!(" 3. Volver al menu anterior");
//user input
stdin().read_line(&mut line)
.ok()
.expect("Fallo al ingresar opcion");
//trim aquired string
let opt = trim_input (&mut line);
}
fn midgar_menu()
{
//mutable input string
let mut line = String::new();
//Selection Menu
println!(" Bienvenido al menu de Midgar");
//selection menu
println!("Elija una opcion :");
println!(" 1. Acceso a equipos");
println!(" 2. Acceso a backups");
println!(" 3. Volver al menu anterior");
//user input
stdin().read_line(&mut line)
.ok()
.expect("Fallo al ingresar opcion");
//trim aquired string
let opt = trim_input (&mut line);
}
fn trim_input (s: &mut String) ->String
{
if s.ends_with('\n')
{
s.pop();
}
if s.ends_with('\r')
{
s.pop();
}
s.starts_with('1');
return s.to_string();
}此脚本的输出如下:
~/testfields/rust$ ./input_test
Bienvenido al menu de Bifrost
Elija una opcion :
1. Acceso a monitor de estado
2. Acceso a dispositivos
3. salir del menu
1
1 witness print
Bienvenido al menu de Heimdall
Elija una opcion :
1. Reachability test
2. SNMP quick monitoring
3. Volver al menu anterior
2
Bienvenido al menu de Bifrost
Elija una opcion :
1. Acceso a monitor de estado
2. Acceso a dispositivos
3. salir del menu
3
13 witness print
ERROR : por favor ingrese una opcion valida
Presione cualquier tecla para continuar ...最后的“证人印”应该是"3“而不是"13”,有没有办法用"3“来覆盖"1”?
发布于 2022-08-02 05:48:13
您应该在每次迭代结束时(或开始时)调用line.clear(),这比在循环中移动变量要好,因为这样做会导致更多的分配(这比使用字符串的clear更昂贵)。
https://stackoverflow.com/questions/73199403
复制相似问题