web-dev-qa-db-fra.com

Java Classe de lecture de chaînes de scanner

J'ai reçu le code suivant:

int nnames;
String names[];

System.out.print("How many names are you going to save: ");
Scanner in = new Scanner(System.in);
nnames = in.nextInt();
names = new String[nnames];

for (int i = 0; i < names.length; i++){
  System.out.print("Type a name: ");
  names[i] = in.nextLine();
}

Et la sortie de ce code est la suivante:

How many names are you going to save:3 
Type a name: Type a name: John Doe
Type a name: John Lennon

Remarquez comment il a sauté l'entrée du prénom ?? Il l'a sauté et est allé directement à l'entrée du deuxième nom. J'ai essayé de chercher ce qui cause cela, mais je ne semble pas être en mesure de le résoudre. J'espère que quelqu'un pourra m'aider. Merci

26
marcoamorales

La raison de l'erreur est que le nextInt extrait uniquement l'entier, pas la nouvelle ligne. Si vous ajoutez un in.nextLine () avant votre boucle for, il mangera la nouvelle ligne vide et vous permettra d'entrer 3 noms.

int nnames;
String names[];

System.out.print("How many names are you going to save: ");
Scanner in = new Scanner(System.in);
nnames = in.nextInt();

names = new String[nnames];
in.nextLine();
for (int i = 0; i < names.length; i++){
        System.out.print("Type a name: ");
        names[i] = in.nextLine();
}

ou lisez simplement la ligne et analysez la valeur sous forme de nombre entier.

int nnames;
String names[];

System.out.print("How many names are you going to save: ");
Scanner in = new Scanner(System.in);
nnames = Integer.parseInt(in.nextLine().trim());

names = new String[nnames];
for (int i = 0; i < names.length; i++){
        System.out.print("Type a name: ");
        names[i] = in.nextLine();
}
26
Joshua

utilisez sc.nextLine (); deux fois afin que nous puissions lire la dernière ligne de chaîne

sc.nextLine () sc.nextLine ()

5
Ankur Nirmalkar

C'est parce que le in.nextInt () ne change pas de ligne. Donc, vous "entrez" d'abord (après avoir appuyé sur 3) provoque la lecture de endOfLine par votre in.nextLine () dans votre boucle.

Voici un petit changement que vous pouvez faire:

int nnames;
    String names[];

    System.out.print("How many names are you going to save: ");
    Scanner in = new Scanner(System.in);
    nnames = Integer.parseInt(in.nextLine());
    names = new String[nnames];

    for (int i = 0; i < names.length; i++){
            System.out.print("Type a name: ");
            names[i] = in.nextLine();
    }
2
Nettogrof

Cela parce que in.nextInt () ne reçoit qu'un numéro int, ne reçoit pas de nouvelle ligne. Vous entrez donc 3 et appuyez sur "Entrée", la fin de la ligne est lue par in.nextline ().

Voici mon code:

int nnames;
String names[];

System.out.print("How many names are you going to save: ");
Scanner in = new Scanner(System.in);
nnames = in.nextInt();
in.nextLine();
names = new String[nnames];

for (int i = 0; i < names.length; i++){
        System.out.print("Type a name: ");
        names[i] = in.nextLine();
}
2
wangzhengyi

Vous auriez pu simplement remplacer

names[i] = in.nextLine(); avec names[i] = in.next();

L'utilisation de next () ne renverra que ce qui précède un espace. nextLine () déplace automatiquement le scanner vers le bas après avoir renvoyé la ligne actuelle.

0
Angelin Nadar