首頁 > Java > java教程 > 主體

Java之Scanner.nextLine()讀取回車的問題如何解決

PHPz
發布: 2023-04-15 09:19:11
轉載
1095 人瀏覽過

問題描述

我們在使用java讀取鍵盤輸入時,如果先讀取一個int變量,再讀取下一行的字串時,會發現程式運行結果與預期不符,程式並沒有讀取到下一行的字串。

即發生在以下情況:

Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
String s=sc.nextLine();
登入後複製

問題分析

從程式碼分析我們的需求是先輸入一個int變量,再在下一行輸入一個字串,也就是說我們使用鍵盤輸入的時候,其實輸入了三部分:

3
words

分別是:數字3,換行符,字串words。

如何處理多出來的換行符號

從剛才的分析可以看到,問題的原因是nextLine()方法沒有讀取到我們的字串,而是讀入了我們的Enter換行符。

方法一

既然多出了一個換行符,那我們可以在讀取字串之前就讀換行符:

Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
sc.nextLine();//将换行符读掉
String s=sc.nextLine();
登入後複製

方法二

重新建立Scanner物件:

Scanner sc1=new Scanner(System.in);
int n=sc1.nextInt();
Scanner sc2=new Scanner(System.in);
String s=sc2.nextLine();
登入後複製

這樣在讀取完n之後,換行符號會被丟棄,下一行被視為sc2開始讀入的位置。

實戰

以下是tengxun公司2020年4月26日暑期軟體相關職位實習筆試的第一題:

資料結構基礎之一一隊列

佇列有五種基本操作,插入隊尾、取出隊首、刪除隊首、佇列大小、清空佇列。

現在讓你模擬一個佇列的操作,具體格式參考輸入。

輸入描述:

第一行輸入一個整數T,表示接下來有T組測試資料。
對於每組測試資料:
第一行輸入一個整數Q,表示有Q次操作。
接下來Q行,每行輸入一種佇列操作方式,具體格式如下:
初始狀態下佇列為空。
插入隊尾: PUSH X
取出隊首: TOP//只是看一下隊首元素,不要把隊首元素刪除
刪除隊首: POP
隊列大小: SIZE
#清空佇列: CLEAR
11保證操作為以上5種的任一種。

輸出描述:

對於每組測試資料:
如果操作為“取出隊首”,輸出隊首元素,如果無法取出,輸出“ -1”
如果操作為“刪除隊首”,如果無法刪除,輸出“-1”
如果操作為“佇列大小”,則輸出佇列大小
其他操作無需輸出

#範例輸入

2
7
PUSH 1
PUSH 2
TOP
POP
TOP
POP
POP
5
PUSH 1
PUSH 2
SIZE
POP
SIZE

結果:

##1

# 2
-1
2
1

問題解答

這題並不難,使用LinkedList就可以實現上述操作,當然,Queue的底層實作本來就是LinkedList。

之所以列舉這題是因為這題會出現nextLine()讀取失敗的問題,因為我們首先要讀取整形變數T,之後再往後逐行讀取,如果不處理換行符的問題,將導致程式運行出現異常。

我的AC答案:

import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc =new Scanner(System.in);
        int t=sc.nextInt();
        while(t>0){
            int q=sc.nextInt();
            List<Integer> n=new LinkedList<>();
            for(int i=0;i<=q;i++){//注意!i<=q,这里的‘=&#39;就是因为q和第一行输入之间的换行符
                String s=sc.nextLine();
                if(s.equals("")){//在这道题中,当我读取到换行符时,直接跳过,不做任何操作
                    continue;
                }
                if(s.startsWith("PUSH")){
                    n.add(Integer.parseInt(s.split(" ")[1]));
                }
                else if(s.equals("TOP")){
                    if(n.size()==0){
                        System.out.println(-1);
                    }
                    else
                        System.out.println(n.get(0));
                }
                else if(s.equals("POP")){
                    if(n.isEmpty()){
                        System.out.println(-1);
                    }
                    else
                        n.remove(0);
                }
                else if(s.equals("SIZE")){
                    System.out.println(n.size());
                }
                else if(s.equals("CLEAR")){
                    n.clear();
                }
            }
            t--;
        }
    }
}
登入後複製

在上面的程式碼中,我首先使用了

for(int i=0;i<=q;i++)
登入後複製

注意到了q與接下來的輸入之間的換行符號。

之後,當遇到換行符號時:

String s=sc.nextLine();
if(s.equals(""))
    continue;
登入後複製
來解決這個問題。

以上是Java之Scanner.nextLine()讀取回車的問題如何解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板