Rust: Zeilenvorschub nach Eingabe entfernen

None
Language icon Language: this article is available in: en

Nach dem Einlesen einer Eingabe vom stdin / Terminal muss man oft mit dem Zeilenvorschub / newline (\n) im eingelesenen String umgehen. Um diesen zu entfernen, kann man unter Rust einfach auf die .pop()-Funktion zurückgreifen, die das letzte Zeichen eines Strings löscht:

use std::io::{Write, stdin, stdout};

fn main() {
    // Intro
    println!("-- INPUT Demo --");
    print!("Please enter something: ");
    stdout().flush().unwrap();

    // Input
    let mut inputvar: String = String::new();                                  
    stdin().read_line(&mut inputvar).expect("Error while data input");         
    inputvar.pop(); // remove trailing newline

    // Output
    println!("Eingabe: {}", inputvar);
}

Mittlerweile habe ich sogar eine bessere plattformunabhängigere Lösung gefunden, die mit den unterschiedlichen Typen von Zeilenvorschüben wie \r (Mac pre Version 10) und \r\n (Windows) umgehen kann:

fn trim_newline(s: &mut String) {
    if s.ends_with('\n') || s.ends_with('\r') {
        s.pop();
        if s.ends_with('\r') {
            s.pop();
        }
    }
}

2 Kommentare

  • Simon

    Tolle Lösung, evtl. willst du sie noch toller machen :) Es gibt bei Rust ein struct namens Cow, welches hierfür Ideal ist. Unter https://hermanradtke.com/2015/05/29/creating-a-rust-function-that-returns-string-or-str.html findetst du dazu eine gute Erklärung. Viele Grüße

    Reply
    • Viktor Garske (moderator)

      Moin, vielen Dank für deinen Hinweis! Mit den Cow types habe ich wieder was dazugelernt. :) Allerdings wird in diesem Beispiel (soweit ich das bisher gesehen habe) kein Cow type benötigt, da kein Speicher allokiert wird und lediglich mit einem mutable ausgeborgten Objekt gearbeitet wird. Viele Grüße Viktor

      Reply
Kommentar verfassen