Maison >Java >javaDidacticiel >Comment résoudre le problème de lecture du retour chariot dans Scanner.nextLine() en Java

Comment résoudre le problème de lecture du retour chariot dans Scanner.nextLine() en Java

PHPz
PHPzavant
2023-04-15 09:19:111126parcourir

Description du problème

Lorsque nous utilisons Java pour lire la saisie au clavier, si nous lisons d'abord une variable int puis lisons la chaîne de la ligne suivante, nous constaterons que le résultat de l'exécution du programme n'est pas celui attendu et que le programme ne lit pas la ligne suivante.

Cela se produit dans la situation suivante :

Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
String s=sc.nextLine();

Analyse du problème

À partir de l'analyse du code, notre exigence est de saisir d'abord une variable int, puis de saisir une chaîne sur la ligne suivante. pour saisir, nous saisissons en fait trois parties :

3
mots

sont : le numéro 3, le caractère de nouvelle ligne, les mots de chaîne.

Comment gérer les caractères de nouvelle ligne supplémentaires

D'après l'analyse de tout à l'heure, nous pouvons voir que la cause du problème est que la méthode nextLine() n'a pas lu notre chaîne, mais a lu notre caractère Enter newline.

Méthode 1

Puisqu'il y a un caractère de nouvelle ligne supplémentaire, nous pouvons lire le caractère de nouvelle ligne avant de lire la chaîne :

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

Méthode 2

Recréez l'objet Scanner :

Scanner sc1=new Scanner(System.in);
int n=sc1.nextInt();
Scanner sc2=new Scanner(System.in);
String s=sc2.nextLine();

De cette façon après n est lu, le caractère de nouvelle ligne est supprimé et la ligne suivante est considérée comme la position où sc2 commence la lecture.

Combat pratique

Ce qui suit est la première question du test écrit de stage d'été du 26 avril 2020 de la société tengxun pour les postes liés aux logiciels :

L'une des bases de la structure des données - File d'attente

La file d'attente comporte cinq opérations de base , en insérant à la fin de la file d'attente, supprimez la tête de la file d'attente, supprimez la tête de la file d'attente, la taille de la file d'attente et effacez la file d'attente.

Vous permet désormais de simuler le fonctionnement d'une file d'attente. Veuillez vous référer à la saisie pour le format spécifique.

Description de l'entrée :

Saisissez un entier T dans la première ligne, indiquant qu'il y aura ensuite T ensembles de données de test.
Pour chaque ensemble de données de test :
Saisissez un entier Q dans la première ligne, indiquant qu'il existe des opérations Q.
Dans la ligne Q suivante, chaque ligne entre dans une méthode d'opération de file d'attente. Le format spécifique est le suivant :
Dans l'état initial, la file d'attente est vide.
Insérez la fin de la file d'attente : PUSH 100
1 garantit que l'opération sera l'un des 5 types ci-dessus.


Description de la sortie :

Pour chaque ensemble de données de test :
Si l'opération est "supprimer le chef de l'équipe", afficher l'élément principal de l'équipe, s'il ne peut pas être supprimé, afficher "-1"

Si l'opération est "supprimer le chef de l'équipe", si impossible de supprimer, affiche "-1"

Si l'opération est "taille de la file d'attente", affiche la taille de la file d'attente
Pas besoin de sortir pour d'autres opérations



Exemple input

2
7

PUSH 1

PUSH 2
TOP

POP
TOP
POP
POP
5
PUSH 2 , utilisez LinkedList Les opérations ci-dessus peuvent bien sûr être réalisées.

La raison pour laquelle j'énumère cette question est parce que cette question posera le problème de l'échec de la lecture de nextLine(), car nous devons d'abord lire la variable entière T, puis la lire ligne par ligne si nous ne traitons pas la variable entière. Un problème de nouvelle ligne entraînera un fonctionnement anormal du programme.

Ma réponse 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--;
        }
    }
}

Dans le code ci-dessus, j'ai d'abord remarqué le caractère de nouvelle ligne entre q et l'entrée suivante en utilisant
for(int i=0;i<=q;i++)

.

Ensuite, lorsqu'un caractère de nouvelle ligne est rencontré :
String s=sc.nextLine();
if(s.equals(""))
    continue;

pour résoudre le problème.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer