ホームページ > Java > &#&チュートリアル > JavaのScanner.nextLine()でキャリッジリターンを読み取る問題を解決する方法

JavaのScanner.nextLine()でキャリッジリターンを読み取る問題を解決する方法

PHPz
リリース: 2023-04-15 09:19:11
転載
1120 人が閲覧しました

問題の説明

Java を使用してキーボード入力を読み取る場合、最初に int 変数を読み取り、次に次の行の文字列を読み取ると、プログラムの実行結果が期待どおりではないことがわかります。プログラムは文字列の次の行を読み取られませんでした。

これは次の状況で発生します:

Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
String s=sc.nextLine();
ログイン後にコピー

問題分析

コード分析から、最初に int 変数を入力し、次の変数に文字列を入力する必要があります。キーボードを使用して入力するとき、実際には次の 3 つの部分を入力します:

3
words

それは、数字の 3、改行です。文字と文字列の単語。

余分な改行に対処する方法

先ほどの分析からわかるように、問題の原因は、 nextLine() メソッドが文字列を読み取らず、文字列を読み取ったことです。改行文字を入力します。

方法 1

余分な改行文字があるため、文字列を読み取る前に改行文字を読み取ることができます:

Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
sc.nextLine();//将换行符读掉
String s=sc.nextLine();
ログイン後にコピー

方法2

Scanner オブジェクトを再作成します:

Scanner sc1=new Scanner(System.in);
int n=sc1.nextInt();
Scanner sc2=new Scanner(System.in);
String s=sc2.nextLine();
ログイン後にコピー

このように、n が読み取られた後、改行文字は破棄され、次の行が先頭とみなされます。 sc2の場所。

実践演習

以下は、2020 年 4 月 26 日に行われた tengxun company の夏季ソフトウェア関連職インターンシップ筆記試験の最初の質問です:

基本の 1 つデータ構造の - キュー

キューには、キューの末尾の挿入、キューの先頭の削除、キューの先頭の削除、キューのサイズ、キューのクリアという 5 つの基本操作があります。

キューの操作をシミュレートできるようになりました。特定の形式については入力を参照してください。

入力説明:

最初の行に整数 T を入力します。これは、次に T セットのテスト データがあることを示します。
テスト データの各セットについて:
最初の行に整数 Q を入力し、Q 操作があることを示します。
次の Q 行、各行はキュー操作メソッドに入ります。具体的な形式は次のとおりです。
初期状態では、キューは空です。
キューの末尾を挿入: PUSH キューをクリア: CLEAR
11 動作は上記5種類のいずれかであることが保証されています。


出力の説明:

テスト データの各セットについて:

操作が「チームの先頭を削除する」場合、先頭要素を出力します。チーム、取り出せない場合は「-1」を出力

操作が「キューヘッド削除」の場合、削除できない場合は「-1」を出力
操作が「キューサイズ」の場合、キューのサイズを出力します

他の操作を出力する必要はありません


入力例

2

7

PUSH 1
PUSH 2

TOP
POP
TOP
POP
POP
5
プッシュ 1
プッシュ 2
サイズ
POP
サイズ


結果:

1

2

-1
2

1


質問の答え

これもちろん、Queue の基礎となる実装は LinkedList です。

この質問をリストする理由は、最初に整数変数 T を読み取ってから、それを 1 行ずつ読み取る必要があるため、この質問では nextLine() 読み取りエラーの問題が発生するためです。処理されない場合、改行文字の問題によりプログラムが異常実行されます。

私の 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--;
        }
    }
}
ログイン後にコピー

上記のコードで、私はまず、q と次の

for(int i=0;i<=q;i++)
ログイン後にコピー

を使用した入力の間にある改行文字に気づきました。

その後、改行文字が見つかった場合:

String s=sc.nextLine();
if(s.equals(""))
    continue;
ログイン後にコピー

で問題は解決します。

以上がJavaのScanner.nextLine()でキャリッジリターンを読み取る問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート