0

I wrote some Python code to separate numbers, uppercase letters, lowercase letters and special characters. password_chars is a list where each index is a character from a string that I inputted and this code is in a for loop, each index is the for loop is a single character in a loop. The numbers being increased by one are keeping count of the number of lowercase letters, uppercase letters and special characters:

try:
    int(password_input[i])
    numbers += 1
except ValueError:
    if password_chars[i] != password_chars[i].lower():
        capital_letters += 1
    elif password_chars[i] != password_chars[i].upper():
        lowercase_letters += 1
    else:
        special_chars += 1

I also wrote some C++ code do do the same (character is an index of an array made from a string, and this is also in a for loop):

try {
    int temp = stoi(character);
    numbers_index ++;
}
catch(std::invalid_argument& e) {
    if(character >= "A" && character <= "Z") {
        capital_letters_index ++;
    } else if(character >= "a" && character <= "z") {
        lowercase_letters_index ++;
    } else {
        special_chars_index ++;
    }
}

I have successfully written a simple Rust way to separate numbers from the rest (character is an index of a vector, this is also in a for loop):

match character.to_string().parse::<u8>() {
    Ok(_) => {
        numbers_index += 1;
    }
    Err(_e) => {
        // other sorters go here
    }
}

but I have been unable to find a way to separate them. The main solution I have been working on is:

match character.to_string().to_uppercase() {
    Ok(..) => {
        capital_letters_index += 1;
    }
    Err(..) => {
        match character.to_string().to_lowercase() {
            Ok(..) => {
                lowercase_letters_index += 1;
            }
            Err(..) => {
                special_chars_index += 1;
            }
        }
    }
}

but I get this compile error:

error[E0308]: mismatched types
  --> src\main.rs:43:29
   |
39 |                         match character.to_string().to_lowercase() {
   |                               ------------------------------------ this expression has type `String`
...
43 |                             Err(..) => {
   |                             ^^^^^^^ expected struct `String`, found enum `std::result::Result`
   |
   = note: expected struct `String`
                found enum `std::result::Result<_, _>`

and after a lot of looking up and a few days of looking at it, I cannot figure out how to fix this. I am completely open to other ways of counting these, this is just the easiest one I could think of.

Shepmaster
  • 388,571
  • 95
  • 1,107
  • 1,366
  • Can you expand on what you don't understand from the error message? *expected struct `String`, found enum `std::result::Result`* — you have a `Result`, but you should have a string. – Shepmaster May 04 '21 at 19:12
  • Your question might be answered by the answers of [How to match a String against string literals?](https://stackoverflow.com/q/25383488/155423). If not, please **[edit]** your question to explain the differences. Otherwise, we can mark this question as already answered. – Shepmaster May 04 '21 at 19:13

1 Answers1

0

Somebody pointed me to https://doc.rust-lang.org/std/primitive.char.html and it worked.