发布于 2015-09-13 13:59:59
您可以通过拥有一个字节数组并继续读取直到Result变成一个Err来做到这一点。但是,这有一个问题,因为如果您没有阅读ASCII字符,这可能会成为问题。如果要解决这个问题,最好只分配一个String,并使用chars迭代器,因为它处理这个问题。
样本代码:
use std::io::{stdin, Read};
fn main() {
loop {
let mut character = [0];
while let Ok(_) = stdin().read(&mut character) {
println!("CHAR {:?}", character[0] as char);
}
}
}样本输出:
Hello World
CHAR Some('H')
CHAR Some('e')
CHAR Some('l')
CHAR Some('l')
CHAR Some('o')
CHAR Some(' ')
CHAR Some('W')
CHAR Some('o')
CHAR Some('r')
CHAR Some('l')
CHAR Some('d')
CHAR Some('\n')
你好世界
CHAR Some('\u{e4}')
CHAR Some('\u{bd}')
CHAR Some('\u{a0}')
CHAR Some('\u{e5}')
CHAR Some('\u{a5}')
CHAR Some('\u{bd}')
CHAR Some('\u{e4}')
CHAR Some('\u{b8}')
CHAR Some('\u{96}')
CHAR Some('\u{e7}')
CHAR Some('\u{95}')
CHAR Some('\u{8c}')
CHAR Some('\n')发布于 2015-09-13 15:04:41
对于您可能关心的情况,XAMPPRocky的回答是正确的,ASCII字符。我想按照你的措辞来回答这个问题:
我只想迭代我的CLI应用程序的标准输入中的字符。
在Rust中,char是一种32位(4字节)类型,表示Unicode编码点.但是,IO抽象在字节级别上运行。你需要带来某种编码,把编码点映射到字节序列,而当前的胜利者是UTF-8。
UTF-8将使用最大4字节来表示单个代码点,但使用的是与本机不同的位模式。要正确逐字读取,您将始终需要某种缓冲区.
还有一个问题,就是在缓冲区的末尾有一个部分字符,需要移回缓冲区的开头,这是比较昂贵的。最好的解决方案是对许多字符的成本进行摊还,因此,为什么以更大的块进行阅读会更快。
发布于 2022-02-12 12:22:30
对于那些来自未来的人,我们在fn bytes(self) -> Bytes<Self>](链接)中使用了std::io::Read,它允许我们以一种更优雅的方式重新实现XAMPPRocky码。
use std::io::{Read, stdin};
fn main() {
for c in stdin().bytes().map(|x| x.expect("cannot read char from stdin")) {
println!("CHAR {}", char::from(c));
}
}https://stackoverflow.com/questions/32549784
复制相似问题