Rust 实战练习 - 1. 输入,输出,环境变量,字符,字符串

目标:

  • 获取程序命令行参数
  • 标准输入输出
  • 获取环境变量
  • 字符串,字符初步学习

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编码的.
}
相关推荐
2603_965148112 小时前
如何解析JSON数据?API返回的商品信息处理教程
开发语言·数据库·python·自动化·json·api
知无不研5 小时前
lambda表达式的使用(3)
开发语言·c++·lambda
cfm_29145 小时前
SpringAI + Ollama 本地大模型
java·开发语言·人工智能·语言模型
C++ 老炮儿的技术栈6 小时前
基于Qt实现轻量化本地音乐播放器
开发语言·c++·qt·c·播放器·音乐
qq_448011166 小时前
C语言中的柔性数组
c语言·开发语言·柔性数组
小白学大数据6 小时前
长周期爬虫的数据一致性:断点续爬 + 事务回滚保障采集质量
开发语言·爬虫·测试工具
zlinear数据采集卡7 小时前
D223上位机C#开发实战:从帧解析到波形显示的完整实现
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
Poo_Chai7 小时前
QT emit信号后完整处理流程,包括槽函数响应流程
java·开发语言·数据库
Thneonl7 小时前
一个人从 Rust 内核做到 React 前端:我做了一个云原生 SRE 巡检图谱桌面工具
rust
瑞码空间7 小时前
Java 图形界面(GUI)完整知识点手册
java·开发语言·图形界面·swing