这是我第一次提问。如果我违反任何规则,请告诉我:)
我想验证用户只输入一个字符并存储在我最初已声明的变量中。同样,如果用户没有按照要求进行操作,请回退问题以便用户再次输入
这是我到目前为止所做的事情
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;
}
}
}
我知道我可以将它们都放在一个do-while循环中,但我想专注于获取布尔值来检查用户输入。
编辑:我只希望用户只输入一个字符
恩。 '@'或'a'
而“@@”或“我正在输入不是一个字符的东西”是错误的
在if
和while
的空格内是我希望它被验证的方式
答案 0 :(得分:1)
请根据与Max的讨论检查下面的代码,我使用.length()
方法检查用户输入的字符串的长度。
您可以使用Character类中的某些方法检查字符的类型以避免第一个if语句中的runtime
异常,该方法用于检查输入是否为数字/字母?
Character.isDigit(char)的
Character.isLetter(char)
Character.isLetterOrDigit(char)的
我还更改了一些变量名,Java遵循camel case
样式,类名必须大写。我还重构了一些代码来检查数字的范围,以便不再重复相同的代码,检查方法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;
}
}
答案 1 :(得分:1)
没有必要检查&#34;只输入1个字符&#34;。这是没有意义的。您无法预测未来,因此您无法知道用户是否在输入1个字符后输入更多字符。您将只输入输入的第一个字符并使用它并忽略任何可能的附加字符 - 或者您必须等待超过1个字符,这实际上是为执行正确操作的用户(仅输入一个字符)打破程序,能够在他们最终做错事时给他们一个错误信息(输入另一个角色)。
话虽如此,这段代码:
user_Char = myKeyboard.next().charAt(0);
实际上会等待输入几个字符,直到输入某种分隔符(默认情况下为某些空白字符,例如换行符)。这完全是你不想要的东西。
您希望从输入中获取一个字符,而只需输入一个字符。在此之后,您不必关心输入更多字符:
user_Char = myKeyboard.next(".").charAt(0);
这会告诉myKeyboard
返回与正则表达式&#34;。&#34; 匹配的下一个String
,这是任何字符,只有1个字符。
如果要验证输入的字符,例如只允许使用字母数字字符,您可以将if
和while
更新为以下内容:
if (!Pattern.matches("[a-zA-Z0-9]", new String(user_Char)))
甚至更好,使用String
返回的myKeyboard.next(".")
:
String user_String = myKeyboard.next(".");
user_Char = user_String.charAt(0);
if (!Pattern.matches("[a-zA-Z0-9]", user_String))
或者您可以直接告诉myKeyboard
仅允许有效字符并跳过整个do/if/while
错误处理:
user_Char = myKeyboard.next("[a-zA-Z0-9]").charAt(0);
修改强>
您的代码目前无法处理的一件事是无效输入,例如致电nextInt
时的字母。这实际上会抛出java.util.InputMismatchException
,您可能希望将nextInt()
和next(...)
个调用封装在try-catch
块中以处理这些异常。