Rust的标准输入与输出

根据上一篇文章Win11环境下搭建Rust开发环境,我们完成了Rust开发环境的搭建,接下来我们继续学习Rust的输入输出。

1、键盘输入与屏幕显示

我们编写程序的目的,就是为了对输入进行处理,然后将处理结果反馈给用户,对于初学者我们一般是将处理结果直接显示在屏幕上。我们在Win11环境下搭建Rust开发环境一文中学到了语句println!("Hello world!");的作用是在屏幕上输出Hello world!字符串。这里的println!是宏,而不是函数(如果是函数调用,应该是println而不是println!)。
对于一般的程序生命周期,我们都需要了解这个程序需要完成什么样的工作,也就是了解需求,然后在此基础上进行程序设计、代码开发、调试、Bug修复验证,之后是将编译的结果交付给需求方运行,最后进入漫长的完善优化、Bug修复验证等漫长的维护阶段,直至程序被新程序替代或废弃为止。后续的学习过程,都将以需求描述、分析设计、编码说明、运行调试为基本过程。

1.1、需求描述

我们需要编写这样一个程序:程序运行后,提示用户输入一些字母或数字后后回车,然后程序在用户输入的内容前面拼接”您的输入内容是:xxx“,这里xxx标识用户输入什么就显示什么。

1.2、分析设计

通过阅读需求,我们可以利用println!宏输出信息,用于完成提示用户输入的工作。同理,我们可以利用Rust标准输入对象获取用户键盘,然后在输入内容前拼接字符串”您的输入是:“后输出到屏幕即可。

1.3、编码说明

根据设计,我们完成程序编码如下:

fn main() {
    println!("请输入字母或数字后回车:");//1
    let mut input_str = String::new();//2
    let stdin = std::io::stdin();//3
    stdin.read_line(&mut input_str).unwrap();//4
    println!("您的输入是:{}", input_str);//5
}

由于的代码控件没有行号,只能在每行代码末尾添加”//数字“的形式标明行号,便于文字说明。
代码中fn main是Rust的函数定义,main.rs中的main函数是Rust程序的入口函数,Rust程序运行后从main函数的第一行代码开始执行。
第一行代码:利用println!宏向屏幕输出提示信息。
第二行:定义一个名称为input_str的变量,同时调用String的关联函数new()(也叫静态函数new)对该变量实例化(实例化也可理解为申请堆内存空间),该变量主要用于保存用户的输入信息。let是Rust的关键字,在声明任何变量前都需要使用let关键字。mut也是let关键字,意思是后续的变量input_str可被修改为其他值,因为该变量保存的是用户输入信息,因此必须用mut修饰该变量。由于input_str变量根据等号右侧的表达式可以推断出该变量的数据类型为String类型,因此这里省略了数据类型声明。完整的变量声明语句应该是:

let mut input_str: String = String::new();//这里  : String  声明了变量的数据类型

第三行:声明了一个类型为std::io::Stdin(根据等号右侧表达式推断)的变量stdin,并通过调用包std::io中的关联函数stdin()获取对象实例。”::“是包分隔符,表示stdin()关联函数位于std包的io包中。这里的包,可以理解为C++中的命名空间,也可以理解为Java中的包。如果包名称比较长,调用包中的函数时,就需要敲击更多次的键盘,因此可以在文件头部使用use关键字,简化包中函数、对象等调用的程序编写。
第四行:通过标准输入(一般是键盘),获取用户输入,并将输入内容保存到变量input_str中。
第五行:将输入内容拼接上”您的输入是:“字符串后输出到屏幕上。其中{}是占位符,运行期用后序参数值替换。

1.4、运行程序

在VSCode中,打开终端(点击主菜单”终端--->新建终端“菜单项),在工程根目录输入cargo run命令并回车,然后根据提示输入1234后回车,程序将输出”您的输入是:1234“,如下图所示:
程序运行结果

可以看到,在输出内容的底部还有一行空行,这是因为输入内容后用户还输入了回车键告诉程序用户输入结束,因此输入的回车符其实应该不算输入的一部分,因此该程序可以优化一下。

2、优化程序

优化后的程序如下:

use std::io::stdin;//1

fn main() {
    println!("请输入字母或数字后回车:");
    let mut input_str = String::new();
    let stdin = stdin();//2
    stdin.read_line(&mut input_str).unwrap();
    println!("您的输入是:{}", input_str.trim());//3
}

2.1、程序说明

第一行:增加use关键字,简化后续stdin关联函数的调用代码(多次调用是,减少的键盘敲击次数更加明显)。
第二行:简化后的std::io:stdin()关联函数的调用代码;
第三行:调用String类型变量input_str的trim()成员函数,去掉字符串前后的空白字符(回车符、空格等字符为不可见字符)。这里也可以看出对象关联函数和成员函数调用方式的区别:String::new()是调用String结构体(可以理解为面向对象中的类)的关联函数new(),input_str.trim()是调用String实例对象input_str(可理解为面向对象中的实例对象)的成员函数trim()。

2.3、程序运行结果

如下图所示:
程序运行结果

从图中可以看到,内容输出后的空行不再出现。

3、通过执行编译后生成的.exe文件运行程序

在VSCode的终端窗口中执行cargo run命令后,会在工程根目录下的target\debug目录中生成.exe文件(文件名称与工程名相同),在我的环境中生成的文件名为rustdemo.exe。打开cmd或powershell窗口,通过cd命令将当前目录切换到”cargo工程根目录下的target\debug目录“,执行rustdemo.exe(powershell中执行命令为.\rustdemo.exe,cmd中执行命令为rustdemo.exe),然后根据提示输入1234,程序将输出”您的输入是:1234“,如下图所示:
程序运行结果

这个生成的.exe文件即可认为是这个需求的交付结果,可以copy到别人的计算机环境中运行。

4、命令行输入参数

之前是在程序运行过程中提示用户输入,但实际我们的程序经常需要在执行命令时就提供参数,例如cd命令,就需要提供切换的目标目录的路径。Rust也可以通过std::env中的相关API,获取命令行参数,例如:

use std::env::args;

fn main() {
    for one_arg in args() { //1
        println!("{}", one_arg);  //2
    }
}

4.1、程序说明

第一行:通过std::evn::args()关联函数获取所有的命令行参数列表,然后利用for循环语句,遍历所有的参数。
第二行:在屏幕输出所有的命令行参数值(数据类型为String)。

4.2、程序运行结果

如下图所示:
程序运行结果

从图中可以看出,命令行参数1、2、3、4、6被逐一输出到屏幕。

上一篇:Win11环境下搭建Rust开发环境
下一篇:Rust之猜数游戏

你可能感兴趣的:(Rust的标准输入与输出)