【ACM模版刷题】Java使用 Scanner连续输入int, String 异常错误输出原因分析
Java使用 Scanner连续输入int, String 异常错误输出原因分析
·
目录
一、Scanner常用语法
Scanner sc =new Scanner(System.in);//从键盘输入 int m = sc.nextInt();//接收输入的int类型 String s1= sc.next();//接收输入的字符串类型,遇到空格会停止接收 String s2=sc.nextLine();//接收输入的字符串类型,会把输入的这一行字符全部接收,包括空格和其他符号
1、sc.nextInt()介绍
- nextInt()方法只能接受整型数据,如果输入非整型,就会有异常
- nextInt()方法本质是调用了next()方法,将next()方法返回的字符串再解析成int型数字返回
- 遇到空格或者回车键会自动停止输入
- 注意点:nextInt()处理完输入的数字后,会留下一个“enter” ,光标还停留在本行
2、sc.next()介绍
- next()方法从合法字符开始读取,如果正式字符前有空格,读取的时候会忽略。
- 读取输入遇到空格或者回车键就停止接收,它不能读两个由空格隔开的单词。
- 注意点:不能吸收上次输入末尾的回车符(打印时不会显示),所以光标还停留在本行
3、sc.nextLine()介绍
- nextLine()方法可以完整的读取输入的这一行全部数据,包括空格和其他字符
- 注意点:可以吸收上次输入末尾的回车符,读取输入后,nextLine()将光标定位在下一行。
4、sc.hasNext()介绍
- hasNext()方法可以连续从键盘输入数据
- 使用while语句配合使用:while(sc.hasNext()){输入语句}
二、报错案例
1、使用next()来接收带有空格的字符串会输出异常
import java.util.*;
import java.lang.*;
public class Test1 {
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
//输入字符串"Hello world"
String s= sc.next();
System.out.println(s);
}
}

异常原因:我们输入字符串"Hello world",想要得到"Hello world",当使用next()来接收时,遇到空 格会停止接收,因此只会输出"Hello"
解决方法:使用nextLine()代替next()来接收输入数据

2、先输入数字再输入字符串的输出异常
import java.util.Scanner;
public class Test1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int n = sc.nextInt();//输入一个字符串数组长度为n
String[] str = new String[n];
for (int i = 0; i < n; i++) {//字符串数组接收键盘输入字符串元素
str[i] = sc.nextLine();
}
for (String s1 : str) {
System.out.println(s1);
}
}
}
}

异常原因:nextInt()接收输入的数字后,按下回车键开始输入第一个字符串元素时,由于nextInt() 只处理数字,不会处理回车键“enter”。
这个“enter”于是被后面的nextLine()接收了当成第一个字符串元素,导致最后字符串数组占用了一个位置,最终结果就是最后一个字符串元素没有输入成功
解决方法:在nextInt()后面在跟着一个nextLine()吸收掉”enter“

三、ACM 模式模板
import java.util.*;
import java.lang.*;
public class Main {
public static void main(String[] args) {
//1.数据输入
Scanner in = new Scanner(System.in);
//读数字
int numLen = in.nextInt();
int[] numArr = new int[numLen];
int i = 0;
while(in.hasNextInt() && i < numLen){
numArr[i] = in.nextInt();
i++;
}
//读字符串
int strLen = in.nextInt();
in.nextLine(); //数字到字符串要换行
String[] strArr = new String[strLen];
//或者 strArr[] = in.nextLine().split(" ");
int j = 0;
while(in.hasNextLine() && j < strLen){
strArr[j] = in.nextLine();
j++;
}
//2. 处理
Solution solution = new Solution();
String result = solution.process(numArr, strArr);
//3. 输出
System.out.println(result);
//四舍五入输出小数
String str = String.format("%.2f",3.555);
System.out.println(str);
}
}
//下面类似 LeetCode 的核心代码模式
class Solution {
public String process(int[] nums, String[] strs) {
StringBuilder sb = new StringBuilder();
sb.append(Arrays.toString(nums));
sb.append(" && ");
sb.append(Arrays.toString(strs));
return sb.toString();
}
}
ACM模式的Java模版 见此链接:https://blog.csdn.net/dlhjw1412/article/details/123821153
自己手写的模版ACM:

更多推荐

所有评论(0)