본문 바로가기

카테고리 없음

[Rust] 숫자를 입력 받기

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()을 통해 문자열 앞 뒤에 붙은 공백 문자를 제거하고 파싱 할 수 있습니다.