let mut str = String::new();
std::io::stdin().read_line(&mut str).expect("failed to read from stdin");
let v = str
.split_whitespace()
.map(|str| str.parse::<i32>().unwrap())
.collect::<Vec<_>>();
Rust는 C++의 cin처럼 자동으로 숫자 입력을 받아주지 않기에 직접 변환을 해야 합니다.
위 코드는 "1 2 3" 입력을 [1, 2, 3] 벡터로 변환합니다.
std::io::stdin().read_line(&mut str)
pub fn read_line(&self, buf: &mut String) -> io::Result<usize> {
self.lock().read_line(buf)
}
stdin에서 문자열을 입력받아 버퍼에 넣습니다. 입력이 실패하면 에러, 성공하면 입력받은 바이트 수를 반환합니다. 이때 문자열에 이미 데이터가 있으면 그 뒤에 붙어서 입력됩니다.
str.split_whitespace()
pub fn split_whitespace(&self) -> SplitWhitespace<'_> {
SplitWhitespace { inner: self.split(IsWhitespace).filter(IsNotEmpty) }
}
문자열을 공백문자(스페이스, 텝, 엔터 등)으로 분리합니다. 반환값인 SplitWhitespace는 &str을 가지는 iterator입니다.
.map(|str| str.parse::<i32>().unwrap()).collect::<Vec<_>>();
나누어진 문자열에 각각 i32로 파싱을 시도하고 결과를 Vec로 묶어냅니다.
.map(|str| str.parse::<u32>().unwrap()).collect::VecDeque<_>>();
다른 타입이 필요하다면 적절히 명시하면 됩니다.
let mut str = String::new();
std::io::stdin().read_line(&mut str).expect("failed to read from stdin");
let num = str.trim().parse::<i32>().unwrap();
만약 입력받으려는 숫자가 하나라면 trim()을 통해 문자열 앞 뒤에 붙은 공백 문자를 제거하고 파싱 할 수 있습니다.