Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JAVA: verify user input for one character

Tags:

java

input

this is my first time asking a question. If I'm breaking any rules let me know please :)

I want to verify that the user only types in only one character and store in a variable I have already declared initially. As well, loop back the question for user to type in again if they did not do what they are asked for

Here is a what I have done so far

import java.util.Scanner;

public class arraytesting {

public static void main(String[] args) {
    Scanner myKeyboard = new Scanner(System.in);
    int user_Choice;
    int rowAndcolumns;
    char[][] user_Array;
    char user_Char;
    do {
        System.out.print("Enter your choice (1 to 9): ");
        user_Choice = myKeyboard.nextInt();
        if (user_Choice < 1 || user_Choice > 9)
            System.out.println("Illegal choice, please try again.");
    } while (user_Choice < 1 || user_Choice > 9);

    switch (user_Choice) {
    case 1:
        do {
            System.out.print("\nHow many rows and columns (min 4 & max 20)? ");
            rowAndcolumns = myKeyboard.nextInt();
            if (rowAndcolumns < 1 || rowAndcolumns > 9)
                System.out.println("Illegal choice, please try again.");
        } while (rowAndcolumns < 4 || rowAndcolumns > 20);

        do {
            System.out.print("Which character do you want to fill your square with? (only one character)");
            user_Char = myKeyboard.next().charAt(0);
            if () // error message for user if they did not type correctly, Idk what to put in the
            System.out.println("Illegal choice, please try again.");// boolean for it to compare
                System.out.print(user_Char);
        } while (); // using do-while loop to loop back question, if they don't type in correctly, i
                                // would only like for user to type in only one character
        break;
    }
}

}

I know I can put both of them in one do-while loop, but I want to focus on getting the boolean to check for user input.

edit: I would only like the user to enter only one single character ex. '@' or 'a' whereas "@@" or "i am typing something that is not one character" is wrong inside the spaces of if and while are how I want it to be verified

like image 570
ClubSavage Avatar asked Jun 21 '26 07:06

ClubSavage


2 Answers

There is no need to do any check for "only 1 character entered". That makes no sense. You can't predict the future, so you cannot know if a user will enter more characters after 1 character has been entered. You will either just take the first character entered and work with it and ignore any potential additional characters - or you have to wait for more than 1 character, essentially breaking the program for users who do the right thing (enter only one character), just to be able to give them an error message when they finally do the wrong thing (enter another character).

That being said, this code:

user_Char = myKeyboard.next().charAt(0);

will actually wait for several characters to be entered until some kind of delimiter (per default some whitespace character, e.g. newline) is entered. That's exactly what you do not want.

You want to get one character from input, and one only. You don't have to care about more characters being entered after that:

user_Char = myKeyboard.next(".").charAt(0);

This tells myKeyboard to return the next String that matches the regex ".", which is any character, and only 1 character.

If you want to validate the entered character, e.g. only alphanumeric characters allowed, you can update your if and while to something like this:

if (!Pattern.matches("[a-zA-Z0-9]", new String(user_Char)))

or even better, use the String returned by myKeyboard.next("."):

String user_String = myKeyboard.next(".");
user_Char = user_String.charAt(0);
if (!Pattern.matches("[a-zA-Z0-9]", user_String))

or you could directly tell myKeyboard to only allow valid characters and skip the entire do/if/while error handling:

user_Char = myKeyboard.next("[a-zA-Z0-9]").charAt(0);

Edit

One thing your code doesn't handle right now is invalid inputs, e.g. letters when you call nextInt. This will actually throw a java.util.InputMismatchException, and you might want to wrap your nextInt() and next(...) calls in try-catch blocks to handle these exceptions.

like image 109
Max Vollmer Avatar answered Jun 22 '26 21:06

Max Vollmer


Please check the code below, based on the discussion with Max, I used the .length() method to check the lenght of the string that the user typed.

You can check the type of the character to avoid the runtime exception in the first if statement using some methods in Character class that you use to check if the input is digit/letter or not ?

Character.isDigit(char)

Character.isLetter(char)

Character.isLetterOrDigit(char)

I also changed some variable names, Java is following the camel case style and class name has to be capitalized. I also refactored some code to check the range of the numbers to git rid of repeating same code on and on, check the method betweenExclusive

package stackoverflow.q2;

import java.util.Scanner;

public class Question2 {

public static void main(String[] args) {
    Scanner myKeyboard = new Scanner(System.in);
    int userChoice;
    int rowAndcolumns;
    char[][] user_Array;
    char userChar;
    do {
        System.out.print("Enter your choice (1 to 9): ");
        userChoice = myKeyboard.nextInt();
        if ( !betweenExclusive(userChoice, 1,9) )
            System.out.println("Illegal choice, please try again.");
    } while (!betweenExclusive(userChoice, 1,9));

    switch (userChoice) {
        case 1:
            do {
                System.out.print("\nHow many rows and columns (min 4 & max 20)? ");
                rowAndcolumns = myKeyboard.nextInt();
                if (!betweenExclusive(rowAndcolumns ,1 , 9))
                    System.out.println("Illegal choice, please try again.");
            } while (!betweenExclusive(rowAndcolumns ,4 , 20));

            String input;
            while (true){
                System.out.print("Which character do you want to fill your square with? (only one character)");
                input = myKeyboard.next();
                // error message for user if they did not type correctly, Idk what to put in the
                // boolean for it to compare
                if ( input.length()>1){
                    System.out.print("Illegal character, try again please !!! ");
                }else{
                    userChar = input.charAt(0);
                    System.out.print(userChar);
                    break;
                }
            }  // using do-while loop to loop back question, if they don't type in correctly, i
            // would only like for user to type in only one character
        break;
    }
}

public static boolean betweenExclusive(int x, int min, int max)
{
    return x>=min && x<=max;
}

}

like image 45
Saif Masadeh Avatar answered Jun 22 '26 20:06

Saif Masadeh



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!