我想从 stdin 读取一行并将其存储在字符串变量中,并将字符串值解析为 u32 整数值。read_line() 方法读取 2 个额外的 UTF-8 值,这会导致 parse 方法崩溃。
以下是我尝试删除回车符和换行符的内容:
use std::io;
use std::str;
fn main() {
let mut input = String::new();
match io::stdin().read_line(&mut input) {
Ok(n) => {
println!("{:?}", input.as_bytes());
println!("{}", str::from_utf8(&input.as_bytes()[0..n-2]).unwrap());
}
Err(e) => {
println!("{:?}", e);
}
}
}
Run Code Online (Sandbox Code Playgroud)
在 Rust 中执行此操作最惯用的方法是什么?
我的问题已得到部分回答,因此我对它进行了修改,以回应从评论和其他实验中学到的知识。
总而言之,我想要一个用于编程比赛的快速I / O例程,在该例程中,一个文件即可解决问题,而无需外部包装。它应从BufRead(标准输入或文件)空白序列中读取标记。标记可以是整数,浮点数或ASCII词,用空格和换行符分隔,因此看来我应该FromStr一般支持类型。少数问题是交互式的,这意味着一开始并不是所有输入都可用,但是总会出现完整的问题。
对于上下文,这是导致我在此处发布的讨论。有人编写了非常快速的自定义代码,以直接从的&[u8]输出中解析整数BufRead::fill_buf(),但在中不是通用的FromStr。
到目前为止,这是我最好的解决方案(强调Scanner结构):
use std::io::{self, prelude::*};
fn solve<B: BufRead, W: Write>(mut scan: Scanner<B>, mut w: W) {
let n = scan.token();
let mut a = Vec::with_capacity(n);
let mut b = Vec::with_capacity(n);
for _ in 0..n {
a.push(scan.token::<i64>());
b.push(scan.token::<i64>());
}
let mut order: Vec<_> = (0..n).collect();
order.sort_by_key(|&i| b[i] - a[i]);
let ans: i64 = order
.into_iter()
.enumerate()
.map(|(i, x)| a[x] * …Run Code Online (Sandbox Code Playgroud) 我最近学习了如何使用ioRust文档读取输入,但有没有" 简单 "的方法来读取控制台输入?我的根源是大量挖掘C++,所以从控制台获取输入就像这样简单std::cin >> var.但在Rust,我正在做:
for line in io::stdin().lines() {
print!("{}", line.unwrap());
break;
}
Run Code Online (Sandbox Code Playgroud)
这会读取一次输入,但for循环似乎是一种非常笨拙的方法来实现这一点.我怎么能轻松做到这一点?
我在读取如何读取Rust 1.0中用户的整数输入中的读取整数输入?,但我注意到所有解决方案首先将一个字符串作为输入,然后将其转换为整数.我想知道是否有办法直接读取整数.
这个页面提到了scan!()宏,但由于某些原因,当我使用编译以下程序时它似乎没有运行rustc main.rc.
extern crate text_io;
fn main() {
let mut a: u8;
let mut b: u8;
scan!("{},{}", a, b);
print!("{} {}", a, b);
}
Run Code Online (Sandbox Code Playgroud)
这会产生错误:
error: macro undefined: 'scan!'
scan!("{},{}",a,b);
Run Code Online (Sandbox Code Playgroud) 我刚开始尝试 Rust,所以我实现了 Book 的“猜谜游戏”的修改版本。每次我尝试输入数字时,程序都无法从字符串解析整数:
Guess the number!
Input your guess:
50
You guessed 50
(4 bytes)!
thread 'main' panicked at 'Wrong number format!: ParseIntError { kind: InvalidDigit }', src\libcore\result.rs:997:5
note: Run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
error: process didn't exit successfully: `target\release\experiment.exe` (exit code: 101)
Run Code Online (Sandbox Code Playgroud)
下面应用了代码。
我已经尝试过其他整数类型。
use std::io;
use rand::Rng;
fn main() {
println!("Guess the number!\nInput your guess:");
let mut guess = String::new();
let secnum = rand::thread_rng().gen_range(1,101);
'br: loop {
match io::stdin().read_line(&mut guess) {
Ok(okay) => …Run Code Online (Sandbox Code Playgroud)