2016-05-30 14 views
10

Macro println! trong Rust luôn để lại ký tự dòng mới ở cuối mỗi đầu ra. Ví dụLàm cách nào để in đầu ra mà không có dòng mới trong Rust?

println!("Enter the number : "); 
io::stdin().read_line(&mut num); 

cung cấp cho các đầu ra

Enter the number : 
56 

Tôi không muốn đầu vào của người dùng 56 được trên một dòng mới. Làm thế nào để tôi làm điều này?

Trả lời

11

Thay vào đó, bạn có thể sử dụng số print! macro.

print!("Enter the number : "); 
io::stdin().read_line(&mut num); 

Hãy coi chừng:

Lưu ý rằng stdout là thường xuyên dòng đệm theo mặc định vì nó có thể là cần thiết để sử dụng io::stdout().flush() để đảm bảo sản lượng được phát ra ngay lập tức.

+11

"* Lưu ý rằng stdout thường xuyên được đệm theo mặc định vì vậy có thể cần phải sử dụng' io :: stdout(). Flush() 'để đảm bảo đầu ra được phát ra ngay lập tức. *" - https: //doc.rust-lang.org/std/macro.print!.html – ArtemGr

+0

@ArtemGr: Trong C++ (và CI nghĩ), khi bạn cố gắng đọc từ 'stdin', bộ đệm' stdout' được xóa ngay lập tức. Tôi đã có thể mong đợi (có thể sai) hành vi tương tự từ Rust, và ví dụ được trình bày trên trang 'print! 'Không đọc từ' stdin' để nó không có kết luận về vấn đề này ... bạn có thêm thông tin không? –

+0

@MatthieuM. Tôi đã thực hiện một bài kiểm tra đơn giản trên Windows và Linux với Rust hàng đêm và không có ** xuất hiện xả ra ** nào trong mã của câu trả lời, ví dụ: "Nhập số:" chỉ được in ** sau khi chương trình kết thúc ** và không phải trước khi 'read_line' xảy ra. – ArtemGr

5

Nó phức tạp hơn so với cái nhìn đầu tiên. Các câu trả lời khác đề cập đến macro print! nhưng nó không hoàn toàn đơn giản. Bạn có thể sẽ cần phải xả sạch stdout, vì nó có thể không được ghi vào màn hình ngay lập tức. flush() là một đặc điểm là một phần của std::io::Write do đó cần phải được trong phạm vi cho nó để làm việc (đây là một sai lầm khá dễ dàng sớm).

use std::io; 
use std::io::Write; // <--- bring flush() into scope 


fn main() { 
    println!("I'm picking a number between 1 and 100..."); 

    print!("Enter a number: "); 
    io::stdout().flush().unwrap(); 
    let mut val = String::new(); 

    io::stdin().read_line(&mut val) 
     .expect("Error getting guess"); 

    println!("You entered {}", val); 
} 
Các vấn đề liên quan