Hello,

As I said in the previous post that I have started learning Rust and made a simple fibonacci series generator. Today I made a palindrome string checker. it’s very basic. I haven’t used Enum or Struct in the code since I don’t think it’s necessary in this simple code.

here is the code:

use std::io;

fn main() {
    let mut input = String::new();
    let stdin = io::stdin();
    stdin.read_line(&mut input).unwrap(); // we want to exit in case it couldn't read from stdin

    input = input.replace("\n", ""); // Removing newline

    let mut is_palindrome: bool = true;
    for i in 0..input.len()/2 {
        let first_char: &str = &input[i..i+1];
        let last_char: &str = &input[input.len()-i-1..input.len()-i];
        if first_char != "\n" {
            if first_char != last_char {
                is_palindrome = false;
            }
        }
    }

    println!("palindrome: {}", is_palindrome);
}
  • Solemarc@lemmy.world
    link
    fedilink
    arrow-up
    7
    ·
    edit-2
    17 days ago

    I didn’t see it mentioned but you could remove all trailing & leading whitespace with:

    input = input.trim();
    

    Instead of using replace.

  • BB_C@programming.dev
    link
    fedilink
    arrow-up
    6
    ·
    17 days ago

    Such posts are more suitable as microblogs IMHO.

    Anyway, string lengths are byte lengths, and indexing strings is actually not panic-safe. This is why we have (still-nightly) char-boundary methods now.

    If you want to work on characters. use .chars().count() and .chars().nth().

    And character boundaries are themselves not always grapheme boundaries, which is also something that you might need to keep in mind when you start writing serious code.

    With all that in mind, you should realize, for example, that probably every string reversing beginner exercise answer in every language is actually wrong. And the wrongness may actually start at the underspecified requirements 😉

  • FizzyOrange@programming.dev
    link
    fedilink
    arrow-up
    3
    ·
    17 days ago

    Aside from the better solution with iterators that Flipper mentioned, you can also:

    • Omit the type annotation for is_palindrome - it will be inferred as bool anyway
    • break; after setting is_palindrome = false
    • Use the (0..input.len()/2).all(|i| ...) iterator method instead.
  • livingcoder@programming.dev
    link
    fedilink
    arrow-up
    1
    ·
    10 days ago

    In what scenario could the first character be a newline character? I think that if-statement may be unnecessary, but I never use raw user input like you are here.

  • livingcoder@programming.dev
    link
    fedilink
    arrow-up
    1
    ·
    edit-2
    10 days ago

    I’m not sure that you need a range when pulling the character from the input variable. Simply input[i] and input[input.len() - i - 1] should work.