目标:
- 获取程序命令行参数
- 标准输入输出
- 获取环境变量
- 字符串,字符初步学习
cargo传递参数,需要加上--
rust
use std::{env, ffi::OsString, io, io::Write};
fn main() {
println!("OS Env: {:?} => {:?}", env::current_dir().unwrap(), env::current_exe().unwrap());
let cmdline = env::args().collect::<Vec<String>>().join(" ");
println!("cmdline: {}", cmdline);
let _cmdline2 = env::args_os().map(|v| v.into_string().unwrap()).collect::<Vec<String>>().join(" ");
// Unix路径拼接, 不是拼接为 长路径!
// /usr/bin:../a/b/1.txt
println!("{:?}", env::join_paths(["/usr/bin", "../a/b/1.txt"]).unwrap());
// cargo run -- -a 1 -b xxx --config --set 2
// 操作系统有关的 OsString
for arg in env::args_os() { // OsString
let a = arg.to_string_lossy();
println!("{a}");
}
// 环境变量
for vars in env::vars_os() { // (OsString, OsString)
println!("{:?} \t\t=> {:?}", vars.0, vars.1);
break;
}
// Rust基础类型String
for arg in env::args() { // String
println!("{arg}");
}
for vars in env::vars() { // (String, String)
println!("{:?} \t\t=> {:?}", vars.0, vars.1);
break;
}
println!("PATH={}", env::var("PATH").unwrap());
// 使用标准输入输出
let mut buf = String::new();
let stdin = io::stdin();
print!("\r\nPlease input your code: ");
_ = io::stdout().flush();
if let Ok(n) = stdin.read_line(&mut buf) {
_ = io::stdout().write_all(format!("the input len: {} => {}", n, buf).as_bytes());
}
// 几种常见的字符串类型
let a1 = "abc123"; // &str
let a2 = String::from(a1); // String, 会严格检查字符的UTF8范围
let a3 = OsStr::new("abc"); // OsStr
let a4 = OsString::from(a2); // OsString,兼容windows等遗留问题,可以存储不在UTF8范围内的字符
println!("{:?} {:?}",a3, a4);
let _a5 = CString::new("abc_cstring").unwrap(); // 与CStr配合使用
//let a6 = unsafe{CStr::from_ptr(ptr)}; // 从一个C语言的 char* 字符串 中创建一个CStr
// char是UTF-8编码,所以对于不同字符占用字节不同
// 在使用[u8]对中文处理一定要小心,不能完整截取中文字符时,可能程序挂掉
let b1 = '1'; // char => 1
let b2 = '🍇'; // char, emoji Unicode => 4
let b3 = '咋'; // char, UTF-8 => 3
println!("{} {} {}", b1.len_utf8(), b2.len_utf8(), b3.len_utf8());
// 字符数量计算
let c1 = "温度32。Andy喜欢吃🍉~";
println!("default UTF8 len: {}, chars(unicode) len: {}", c1.len(), c1.chars().count()); // 29, 14
// 所以,统计多语言字符,使用char进行,统计字节数使用默认的utf8编码的.
}