如何检查用户给出的下三个输入是否是 int 值, 假设有三个变量,
- var1
- var2
- var3
我将输入视为,
扫描仪 sc = 新扫描仪 (System.in);
var1 = sc.nextInt();
var2 = sc.nextInt();
var3 = sc.nextInt();
现在,如果我想使用 while(sc.hasNextInt()) 来确定下一个输入是否是 int 那么它只会检查 var1 的下一个输入是否是 int并且不会检查其他变量 var2、var3。通过使用 while 循环
和 if (条件)
可以完成一件事。例如,
Scanner sc = new Scanner (System.in);
while (sc.hasNextInt()) {
var1 = sc.nextInt();
if (sc.hasNextInt()) {
var2 = sc.nextInt();
if (sc.hasNextInt()) {
var3 = sc.nextInt();
}
}
}
但这看起来很长,需要写很多东西。对于我在 Language C 中看到的类似问题,有一个 scanf()
方法可以解决这个问题。例如,
while(scanf("%d %d %d", &var1, &var2 & var3) == 3) {
//这里的语句
}
所以我的问题是java的Scanner.hasNextInt
或Scanner.hasNext("regex")
中是否有此类功能。
我也尝试过 sc.hasNext("[0-9]* [0-9]* [0-9]*")
但实际上并没有起作用。
提前谢谢您。
最佳答案
hasNext(regex)
仅测试单个标记。问题是默认分隔符是一个或多个空格,因此 number number number
不能是单个标记(分隔符 - 空格 - 不能是其中的一部分)。因此,每次 sc.hasNext("[0-9]* [0-9]* [0-9]*")
最终只会测试单个number
。顺便说一句,您的模式 *
可能应该是 +
因为每个数字都应该至少有一位数字。
为了让空格成为标记的一部分,我们需要将它们从分隔符模式中删除。换句话说,我们需要将分隔符模式替换为仅表示行分隔符的分隔符模式,例如 \R
( more info )。这样,如果用户在一行中写入数据(仅在第三个数字后使用 Enter),该行将被视为单个标记,并且可以通过正则表达式进行测试。
稍后您需要将分隔符设置回一个或多个空格 (\s+
),因为 nextInt
也基于单个标记,因此如果没有它,我们最终会尝试解析像 "1 2 3"
这样的字符串。
Scanner sc = new Scanner(System.in);
sc.useDelimiter("\\R");
System.out.print("Write 3 numbers (sepate them with space): ");
while(!sc.hasNext("\\d+ \\d+ \\d+")){
String line = sc.nextLine();//IMPORTANT! Consume incorrect values
System.out.println("This are not 3 numbers: "+line);
System.out.print("Try again: ");
}
//here we are sure that there are 3 numbers
sc.useDelimiter("\\s+");//nextInt can't properly parse "num num num", we need to set whitespaces as delimiter
int var1 = sc.nextInt();
int var2 = sc.nextInt();
int var3 = sc.nextInt();
System.out.println("var1=" + var1);
System.out.println("var2=" + var2);
System.out.println("var3=" + var3);
此解决方案可能存在的问题是 \d+
会让用户提供任意长度的数字,该数字可能超出 int
范围。如果您只想接受 int
,请查看 Regex for a valid 32-bit signed integer 。您也可以使用 nextLong
代替,因为 long
的范围更大,但仍然有最大值。要接受任何整数,无论其长度如何,您都可以使用 nextBigInteger()
。
关于java - 如何使用 Scanner.hasNextInt() 检查接下来的 3 个输入是否为 int 并仅在 java 中循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52264138/