web-dev-qa-db-fra.com

Le scanner ne lit pas la phrase entière - différence entre next () et nextLine () de la classe de scanner

J'écris un programme qui permet à l'utilisateur de saisir ses données puis de les sortir. Son 3/4 est correct mais quand il arrive à la sortie de l'adresse, il n'imprime qu'un mot. Disons seulement 'Archevêque' de 'Archbishop Street' Comment puis-je réparer ça?

import Java.util.*;

class MyStudentDetails{
    public static void main (String args[]){
        Scanner s = new Scanner(System.in);
        System.out.println("Enter Your Name: ");
        String name = s.next();
        System.out.println("Enter Your Age: ");
        int age = s.nextInt();
        System.out.println("Enter Your E-mail: ");
        String email = s.next();
        System.out.println("Enter Your Address: ");
        String address = s.next();

        System.out.println("Name: "+name);
        System.out.println("Age: "+age);
        System.out.println("E-mail: "+email);
        System.out.println("Address: "+address);
    }
}
16
Bonett09

Cette approche fonctionne, mais je ne sais pas comment, peut-on expliquer, comment ça marche ... 

String s = sc.next();
s += sc.nextLine();
30
Arvind Ramachandran

Initialisez le scanner de cette manière afin qu'il délimite l'entrée à l'aide d'un nouveau caractère de ligne.

Scanner sc = new Scanner(System.in).useDelimiter("\\n");

Référez-vous au JavaDoc pour plus de détails

Utilisez sc.next () pour obtenir la ligne entière dans une chaîne

12
Nomad

J'utiliserais Scanner#nextLine opposé à next pour votre attribut address

Cette méthode retourne le reste de la ligne en cours, en excluant tout séparateur de ligne à la fin.

Comme cela retourne la ligne entière, délimitée par un séparateur de ligne, cela permettra à l'utilisateur de saisir n'importe quelle adresse sans contrainte.

11
Anthony Forloney

Le délimiteur par défaut du scanner est un espace. Vérifiez javadoc pour savoir comment changer cela.

5
Raghuram
String s="Hi";
String s1="";

//For Reading Line by hasNext() of scanner 
 while(scan.hasNext()){
  s1 = scan.nextLine();
 }
System.out.println(s+s1);

/*This Worked Fine for me for reading Entire Line using Scanner*/
5
Vinayak

Au lieu d'utiliser System.in et System.out directement, utilisez la commande Console class - elle vous permet d'afficher une invite et de lire une ligne entière (corrigeant ainsi votre problème) d'entrées:

String address = System.console().readLine("Enter your Address: ");
4
Michael Borgwardt
import Java.util.Scanner;
public class Solution {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int i = scan.nextInt();
        double d = scan.nextDouble();
        String s="";
        while(scan.hasNext())
        {
            s=scan.nextLine();
        }

        System.out.println("String: " +s);
        System.out.println("Double: " + d);
        System.out.println("Int: " + i);
    }
}
2
kallipudi yeswanth

Nous pouvons facilement utiliser scan.nextLine. Il lira le reste de l’entrée jusqu’à la fin. Puis assignez-le à votre variable. La phrase entière peut être imprimée facilement . Voici l'exemple pour une meilleure compréhension.

    String s = "HackerRank ";

    Scanner scan = new Scanner(System.in);


    String s2;



    scan.nextLine(); // read the rest of the line of input (newline character after the double token).
    s2 = scan.nextLine();



    /* Concatenate and print the String variables on a new line integer variables on a new line; 

    System.out.println(s + s2);

    scan.close();

} }

2
Malsha

next() peut lire l'entrée uniquement jusqu'à l'espace. Il ne peut pas lire deux mots séparés par un espace. De plus, next() place le curseur sur la même ligne après la lecture de l'entrée.

nextLine() lit l'entrée, y compris l'espace entre les mots (c'est-à-dire jusqu'à la fin de la ligne \n). Une fois l’entrée lue, nextLine() positionne le curseur sur la ligne suivante.

pour lire toute la ligne, vous pouvez utiliser nextLine()

2
Gourab Konar

J'ai essayé de suivre le code mais cela ne s'arrête pas car il n'y a pas de condition de pause, donc il attend toujours l'entrée, peut-être pourriez-vous ajouter une condition de pause

public class Solution {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int i = scan.nextInt();
        double d = scan.nextDouble();
        String s="";
        while(scan.hasNext())
        {
            s=scan.nextLine();
        }

        System.out.println("String: " +s);
        System.out.println("Double: " + d);
        System.out.println("Int: " + i);
    }
}
1
Asid
import Java.util.Scanner;

public class Solution {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String s = scan.next();
        s += scan.nextLine();
        System.out.println("String: " + s);

    }
}
0
ayush sharma

Vous trouverez ci-dessous un exemple de code permettant de lire une ligne dans l'entrée Standard à l'aide de la classe Java Scanner.

import Java.util.Scanner;

public class Solution {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String s = scan.nextLine();
        System.out.println(s);
        scan.close();
    }
}

Contribution:

Bonjour le monde

Sortie:

Bonjour le monde

0
Satyajit Mishra

"il n'imprime qu'un mot. Disons seulement" Archevêque "de" Rue Archevêque "

Il n’imprime que Word car les fonctions du scanner telles que next (), nextInt (), etc. ne lisent qu’un jeton à la fois. Ainsi, cette fonction lit et retourne le prochain jeton.

For example if you have: x y z
 s.next() will return x
 s.nextLine() y z

Revenons à votre code si vous voulez lire toute la ligne "Archbishop Street"

String address = s.next(); // s = "Archbishop"
Then address += s.nextLine(); // s = s + " Street"
0
MLY

J'ai défini le délimiteur de jeton comme étant un motif de nouvelle ligne, lu le jeton suivant, puis remis le délimiteur à sa place.

public static String readLine(Scanner scanner) {
        Pattern oldDelimiter = scanner.delimiter();
        scanner.useDelimiter("\\r\\n|[\\n\\x0B\\x0C\\r\\u0085\\u2028\\u2029]");
        String r = scanner.next();
        scanner.useDelimiter(oldDelimiter);
        return r;
}
0
Gubatron

le code ci-dessous devrait faire ce que vous cherchez:

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    String s = scan.nextLine();
    System.out.println(s);
    scan.close();
}
0
akshaya pandey

Pour obtenir l'adresse complète, ajoutez 

s.nextLine();//read the rest of the line as input

avant

System.out.println("Enter Your Address: ");
String address = s.next();
0
Bharathi Mohan