Rust语言之交互

文章目录

  • 一、获取用户输入
    • 1.读取单行数据
    • 2.读取多行数据
  • 二、一个猜数字的游戏
    • 1.创建一个新项目
    • 2.生成一个随机目标
    • 3.进行一次猜测
    • 4.多次猜测
  • 三、CTF自测工具
    • 1.整理资料
    • 2.写一个检查函数
    • 3.整合代码
    • 4.增加回答次数
  • 四、编译程序


一、获取用户输入

在Rust语言中,你可以使用标准库中的std::io模块来获取用户的输入。

1.读取单行数据

use std::io;  fn main() {  println!("请输入一些文本:");  let mut input = String::new();  match io::stdin().read_line(&mut input) {  Ok(_) => println!("你输入了:{}", input),  Err(error) => println!("读取错误:{:?}", error),  }  
}

2.读取多行数据

use std::io::BufRead;  fn main() {  println!("请输入一些文本:");  for line in std::io::stdin().lock().lines() { // 直接使用std::io::stdin()  match line {  Ok(n) if n == "quit" => break,Ok(l) => println!("你输入了:{}", l),  Err(error) => println!("读取错误:{:?}", error),  }  }  
}

二、一个猜数字的游戏

这也是官方提供的案例

1.创建一个新项目

cargo new guessing_game

  • 编写cargo.toml文件
[dependencies]
rand = "0.9.0-alpha.0"

2.生成一个随机目标

use rand::Rng;fn main() {println!("Guess the number!");let secret_number = rand::thread_rng().gen_range(1..=100);println!("The secret number is: {secret_number}");
}

3.进行一次猜测

use rand::Rng;
use std::cmp::Ordering;
use std::io;fn main() {println!("Guess the number!");// 随机获取一个1-100之间的随机数let secret_number = rand::thread_rng().gen_range(1..=100);println!("The secret number is: {secret_number}");// let mut guess = String::new();io::stdin().read_line(&mut guess).expect("Failed to read line");let guess: u32 = guess.trim().parse().expect("Please type a number!");println!("You guessed: {guess}");match guess.cmp(&secret_number) {Ordering::Less => println!("Too small!"),Ordering::Greater => println!("Too big!"),Ordering::Equal => println!("You win!"),}
}

4.多次猜测

在单次猜测外面嵌套一个loop,注意loop是无条件循环,注意设置循环结束条件

use rand::Rng;
use std::cmp::Ordering;
use std::io;fn main() {println!("Guess the number!");// 随机获取一个1-100之间的随机数let secret_number = rand::thread_rng().gen_range(1..=100);println!("The secret number is: {secret_number}");// loop {let mut guess = String::new();io::stdin().read_line(&mut guess).expect("Failed to read line");let guess: u32 = guess.trim().parse().expect("Please type a number!");println!("You guessed: {guess}");match guess.cmp(&secret_number) {Ordering::Less => println!("Too small!"),Ordering::Greater => println!("Too big!"),Ordering::Equal => {println!("You win!");return;},}}
}

测试没有问题就把打印秘密数字的语句注释掉,利用cargo build进行编译,一个简单的猜数字游戏就完成了。

三、CTF自测工具

由于英文不过关,学习CTF的时候好多单词、语句记不住,利用Rust实现一个自测工具,一方面巩固Rust基础,另一方面每天一练形成肌肉记忆。

1.整理资料

// 东西不多,用Hashmap整理题目和答案的对应。
use std::collections::HashMap;fn main(){let mut questions = HashMap::new();questions.insert(String::from("SQL注入中查询数据库库名的语句"), "select group_concat(schema_name) from information_schema.schemata --+".to_string());questions.insert(String::from("SQL注入中查询数据库表名的语句"),"select group_concat(table_name) from information_schema.tables where table_schema= 'databases' --+".to_string());questions.insert(String::from("SQL注入中查询数据库字段名的语句"),"select group_concat(column_name) from information_schema.columns where table_name= 'tables' and table_schema= 'databases' --+".to_string());questions.insert(String::from("利用sqlmap默认选项注入,绕过空格,读取key"),"python sqlmap.py -r a.txt --batch --file-read \"./key\" --tamper 'space2comment'".to_string());questions.insert(String::from("利用php伪协议读取文件,base64"), "Php://filter/read-convert.base64-encode/resource=../key".to_string());questions.insert(String::from("使用data伪协议执行命令"), "data://text/plain,<?=system('whoami');?>".to_string());for (question,answer)in &questions{println!("question:{},answer:{}",question,answer);}
}

2.写一个检查函数

// 向函数传递问题和答案,获取用户输入匹配答案,返回是否正确。
fn check_answer(question: &str, answer: &str) -> bool {  println!("{} ", question);  let stdin = io::stdin();  let mut reader = stdin.lock();  let mut input = String::new();  reader.read_line(&mut input).unwrap(); // 读取一行输入  let trimmed_input = input.trim(); // 移除可能的前后空白字符,包括换行符  // 检查用户输入是否与正确答案匹配  trimmed_input == answer  
}  

3.整合代码

use std::collections::HashMap;
use std::io::{self, BufRead};  fn main(){let mut questions = HashMap::new();questions.insert(String::from("SQL注入中查询数据库库名的语句"), "select group_concat(schema_name) from information_schema.schemata --+".to_string());questions.insert(String::from("SQL注入中查询数据库表名的语句"),"select group_concat(table_name) from information_schema.tables where table_schema= 'databases' --+".to_string());questions.insert(String::from("SQL注入中查询数据库字段名的语句"),"select group_concat(column_name) from information_schema.columns where table_name= 'tables' and table_schema= 'databases' --+".to_string());questions.insert(String::from("利用sqlmap默认选项注入,绕过空格,读取key"),"python sqlmap.py -r a.txt --batch --file-read \"./key\" --tamper 'space2comment'".to_string());questions.insert(String::from("利用php伪协议读取文件,base64"), "Php://filter/read-convert.base64-encode/resource=../key".to_string());questions.insert(String::from("使用data伪协议执行命令"), "data://text/plain,<?=system('whoami');?>".to_string());for (question,answer)in &questions{if check_answer(question, answer) {  println!("Correct!");  } else {  println!("Incorrect!");  println!("correct answer:{}",answer)}  }
}
fn check_answer(question: &str, answer: &str) -> bool {  println!("{} ", question);  let stdin = io::stdin();  let mut reader = stdin.lock();  let mut input = String::new();  reader.read_line(&mut input).unwrap(); // 读取一行输入  let trimmed_input = input.trim(); // 移除可能的前后空白字符,包括换行符  // 检查用户输入是否与正确答案匹配  trimmed_input == answer  
}  

4.增加回答次数

// 在主函数增加次数条件for (question,answer)in &questions{let mut i = 0; // 回答次数计数器loop {if check_answer(question, answer) {println!("Correct!");  break;} else {  println!("Incorrect!");  }i += 1;// 判断是否达到次数上限if i == 3{ println!("correct answer:{}",answer);break;}}  }

四、编译程序

如果使用高版本linux编译,在低版本Linux中运行,会提示glibc不匹配,所以编译是使用使用musl替代glibc
错误: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.33’ not found (required by ./ctf)

  1. 配置Cargo:
[target.x86_64-unknown-linux-musl]  
linker = "rust-lld" # 或者其他适合musl的链接器

注意:这里假设你使用了lld链接器,但你也可以使用其他支持musl的链接器。

  1. 安装musl工具链:
rustup target add x86_64-unknown-linux-musl
  1. 编译程序:
cargo build --target x86_64-unknown-linux-musl --release

**然后再项目文件夹下的/target/x86_64-unknown-linux-musl/release文件夹下,就可以找到编译好的程序了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/748285.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【设计模式】Java 设计模式之建造者模式(Builder Pattern)

建造者模式&#xff08;Builder Pattern&#xff09;是设计模式中非常实用的一种&#xff0c;它提供了一种创建对象的最佳方式。下面我将结合实际应用场景&#xff0c;深入分析并讲解建造者模式。 一、建造者模式概述 建造者模式是一种对象构建的设计模式&#xff0c;它将一个…

JavaScript中的事件模型(详细案例代码)

文章目录 一、事件与事件流二、事件模型原始事件模型特性 标准事件模型特性 IE事件模型 一、事件与事件流 javascript中的事件&#xff0c;可以理解就是在HTML文档或者浏览器中发生的一种交互操作&#xff0c;使得网页具备互动性&#xff0c; 常见的有加载事件、鼠标事件、自定…

js实现扫描线填色算法使用canvas展示

算法原理 扫描线填色算法的基本思想是&#xff1a;用水平扫描线从上到下扫描由点线段构成的多段构成的多边形。每根扫描线与多边形各边产生一系列交点。将这些交点按照x坐标进行分类&#xff0c;将分类后的交点成对取出&#xff0c;作为两个端点&#xff0c;以所填的色彩画水平…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《适应分布式资源渗透率提高的配电网网元规划方法》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

笔记:《NCT全国青少年编程能力等级测试教程Python语言编程三级》

NCT全国青少年编程能力等级测试教程Python语言编程三级 ISBN:9787302574859 绪论 专题1 序列和元组 考查方向 考点清单 考点1 组合数据类型 序列类型(字符串、列表、元组);集合类型;映射类型。 考点2 元组类型 (一)元组类型…

【QT 5 +Linux下qt软件点击.sh脚本运行+Dconf编辑器+学习他人文章+番外篇:点击脚本运行软件】

【QT 5 Linux下qt软件点击.sh脚本运行Dconf编辑器学习他人文章番外篇&#xff1a;点击脚本运行软件】 1、前言2、实验环境3、自我学习总结-本篇总结1、说明&#xff1a;代替qt的快捷方式2、适用性更广3、了解工具&#xff1a;Dconf编辑器注意事项&#xff1a; 4、参考链接-感谢…

PCM和I2S区别

I2S和PCM接口都是数字音频接口&#xff0c;而所见的蓝牙到cpu以及codec的音频接口都是用PCM接口&#xff0c;是不是两个接口有各自不同的应用呢&#xff1f;先来看下概念。 PCM&#xff08;PCM-clock、PCM-sync、PCM-in、PCM-out&#xff09;脉冲编码调制&#xff0c;模拟语音信…

Python列表详解

文章目录 索引和逆转增删元素和查找元素排序 刷完这60个标准库模块&#xff0c;成为Python骨灰级玩家 索引和逆转 列表几乎是Python中使用频率最高的数据结构了&#xff0c;一般来说&#xff0c;只需用逗号分隔&#xff0c;并用方括号括起来&#xff0c;便是列表。 x [1,2,3…

C++面试100问(八)

C中栈溢出的解决办法有哪些&#xff1f; 1&#xff09;、增加栈内存的数目&#xff1b;如果是不超过栈大小但是分配值小的&#xff0c;就增大分配的大小 2&#xff09;、使用堆内存&#xff1b;具体实现由很多种方法可以直接把数组定义改成指针,然后动态申请内存;也可以把局部变…

C++/CLI使用VS创建 CLR 控制台应用程序

你可以使用“创建新项目”对话框中的“CLR 控制台应用 (.NET Framework)”模板创建已具有基本项目引用和文件的控制台应用项目。 安装 Visual Studio C++ 工作负载时,默认情况下不安装 C++/CLI 支持。 如果没有在“创建新项目”对话框中看到 CLR 项目模板,你可能需要安装 C+…

基础:TCP是什么?

1. TCP 是什么&#xff1f; TCP&#xff08;Transmission Control Protocol 传输控制协议&#xff09; 是一种面向连接的、可靠的、基于字节流的传输层通信协议&#xff0c;由IETF的RFC 793 [1]定义。 TCP旨在适应支持多网络应用的分层协议层次结构。连接到不同但互连的计算机…

集成 Spring Data JPA

文章目录 集成 Spring Data JPA1. 添加依赖2. 配置数据源3. 配置 JPA 属性4. 创建实体类5. 创建仓库接口6. 配置事务管理&#xff08;可选&#xff09;7. 使用仓库8. 处理异常和日志&#xff08;可选&#xff09;9. 自定义仓库方法&#xff08;可选&#xff09;10. 使用 Spring…

如何成为一名优秀的硬件工程师

求知若饥&#xff0c;大智如愚&#xff0c;这是乔布斯说的&#xff0c;很多工程师把这句话作为工程师的最基本的职业素养。 “工程师是科学家&#xff1b;工程师是艺术家&#xff1b;工程师也是思想家。”实际上&#xff0c;工程师是利用自然科学来创造工程的人。工程既是物质…

zabbix配置详解

zabbix-server 主要参数及其作用如下所示&#xff1a; 1、DBHost 数据库主机地址 2、DBName 数据库名称 3、DBUser、DBPassword 数据库用户名和数据库密码 4、DBPort 数据库连接端口 5、AlertScriptPath 告警脚本存放路径 6、CacheSize 缓存大小 7、CacheUpdateFrequency 缓存…

Docker容器化技术(使用Dockerfile制作镜像)

Docker中的镜像分层 Docker 支持通过扩展现有镜像&#xff0c;创建新的镜像。实际上&#xff0c;Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的。 1、Docker 镜像为什么分层 镜像分层最大的一个好处就是共享资源。 比如说有多个镜像都从相…

智慧城市:提升城市治理能力的关键

目录 一、智慧城市的概念及特点 二、智慧城市在提升城市治理能力中的应用实践 1、智慧交通&#xff1a;提高交通治理效率 2、智慧政务&#xff1a;提升政府服务水平 3、智慧环保&#xff1a;加强环境监测与治理 4、智慧安防&#xff1a;提高城市安全水平 三、智慧城市在…

【PythonCode】力扣Leetcode6~10题Python版

【PythonCode】力扣Leetcode6~10题Python版 前言 力扣Leetcode是一个集学习、刷题、竞赛等功能于一体的编程学习平台&#xff0c;很多计算机相关专业的学生、编程自学者、IT从业者在上面学习和刷题。 在Leetcode上刷题&#xff0c;可以选择各种主流的编程语言&#xff0c;如C、…

【python】【多线程】巧用Python 实现多线程批量将 PDF 文档转换为 Word 格式

2. PDF文件批量转换Word 使用 Python 实现多线程批量将 PDF 文档转换为 Word 格式的示例代码&#xff1a; import os import threading from pdf2docx import Converterclass PdfToWordThread(threading.Thread):def __init__(self, pdf_file, output_dir):threading.Thread._…

我的尝试:Codigger + Vim

若您愿意耐心投入&#xff0c;学习 Vim 的过程其实远比想象中轻松。我对 Vim 产生兴趣&#xff0c;主要是源于它对提升生产力的巨大潜力。我尝试了 Neovim、NvChad 以及 Codigger Vim 插件&#xff0c;如今我的工作效率已远超从前。 那么&#xff0c;Vim 究竟是什么呢&#xff…

【调参】如何为神经网络选择最合适的学习率lr-LRFinder-for-Keras

【调参】如何为神经网络选择最合适的学习率lr-LRFinder-for-Keras_学习率选择-CSDN博客文章浏览阅读9.2k次&#xff0c;点赞6次&#xff0c;收藏55次。keras 版本的LRFinder&#xff0c;借鉴 fast.ai Deep Learning course。前言学习率lr在神经网络中是最难调的全局参数&#x…