Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Uso corretto di next() e nextLine()

    Salve a tutti,
    stavo studiando il funzionamento della classe Scanner e mi sono imbattuto in una serie di perplessità.
    In particolare ho capito che il metodo next() - ma anche nextInt(), nextDouble() ecc... - prende solo il primo token della stringa digitata. Quindi, se per esempio facessi:

    codice:
    String str = in.next(); // input da tastiera: "ciao mondo"
    la variabile str conterrebbe solamente "ciao".
    Fin qui d'accordo... ma se in seguito volessi prendere una stringa intera invocando nextLine() non posso. Il programma salta direttamente alla prossima istruzione.
    Non so spiegare esattamente cosa accade, ma è come se il next() restasse in ascolto di un nuovo input, mentre il successivo nextLine() prende semplicemente una riga vuota, senza dare la possibilità all'utente di inserire qualcosa in input.

    Una possibile soluzione che ho trovato è quella di usare sempre e solo nextLine() e poi convertire l'input nel giusto tipo di dato primitivo a seconda del caso (parseInt se int, parseDouble se double ecc...). Per esempio:

    codice:
    String str = in.nextLine();
    int num = Integer.parseInt(str);
    in questo caso la variabile str viene convertita in int. Ma non sarebbe molto più comodo usare direttamente nextInt()?

    Insomma... ci sono altre soluzioni?

  2. #2

    Re: Uso corretto di next() e nextLine()

    Originariamente inviato da Simo990
    in questo caso la variabile str viene convertita in int. Ma non sarebbe molto più comodo usare direttamente nextInt()?
    Insomma... ci sono altre soluzioni?
    Se sai di dover prendere solo interi allora va bene. Altrimenti usa next() o nextLine() a seconda delle tue esigenze.

  3. #3
    Ciao,
    se ho capito bene il comportamento di cui parli e che ti genera i dubbi è dovuto al fatto che l'istruzione next() è in grado di eliminare gli spazi tra un token e il successivo e capisce quando è arrivata al termine dell'input letto richiedendo nuovo input, ma non si posiziona automaticamente all'inizio della nuova riga quando raggiunge l'ultimo token di un input ("consumando" il fine linea). Quindi se invochi nextLine() dopo aver preso tutti i token di una riga tramite next() (da tastiera o da file), il metodo nextLine() non richiede nuovo input o legge la riga successiva, ma ti restituisce una stringa vuota (quindi si posiziona "all'inizio" della prossima riga di input). Solo alla succesiva chiamata di nextLine() il programma chiederà una nuova riga di input o leggerà la riga successiva per esempio dal file.
    Provo a chiarire con due esempi:

    > String str = in.next(); //input da tastiera "Ciao mondo"
    ora str contiene "ciao" ,e il "puntatore" del buffer è posizionato tra "ciao" e "mondo"
    > str = in.next();
    ora str contiene "mondo", e il "puntatore" del buffer è posizionato alla fine della stringa "Ciao mondo", ma prima del carattere di a capo
    > str = in.next();
    ora next() si accorge di aver raggiunto la fine del buffer letto e chiede nuovo input, del quale restituirà solamente il primo token
    etc. etc.

    > String str = in.next(); //input da tastiera "Ciao mondo"
    ora str contiene "ciao" ,e il "puntatore" del buffer è posizionato tra "ciao" e "mondo"
    > str = in.next();
    ora str contiene "mondo", e il "puntatore" del buffer è posizionato alla fine della stringa "Ciao mondo", ma prima del carattere di a capo
    > str = in.nextLine();
    ora nextLine() restituisce il contenuto del buffer letto, dalla posizione corrente del "puntatore" fino al fine linea, "consumando" il fine linea stesso. Poichè il puntatore si trovava dopo la parola "mondo" e subito prima del fine linea, la chiamata a nextLine() restituisce stringa vuota e consuma il fine linea, e solo ad una chiamata successiva richiederà nuovo input

    In effetti il comportamento non pare dei migliori. Un apossibilità può essere testare la restituzione di stringhe vuote ma non so se per te può andare bene.

    Ciao
    Martino

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    il punto è che next() resta in attesa del pattern di chiusura (che se non ricordo male era il newLine), nextLine() prende tutto fino al separatore di linea.

    Guarda un po la documentazione

  5. #5
    Grazie Martino, ora mi è tutto più chiaro
    il mio problema era di far fare una scelta all'utente semplicemente così:
    codice:
    console.print("Scegli un numero e premi invio: ");
    scelta = in.nextInt();
    E a seconda della scelta di far visualizzare una serie di elementi numerati, sempre decisi dall'utente attraverso una stringa in input. Però usando nextLine() subito dopo nextInt() ecco che mi restituiva una stringa vuota e il programma moriva di una morte orribile
    Ho risolto inserendo un altro nextLine() appena prima del nuovo nextLine(), così:
    codice:
    if ( scelta == 1 ) {
       console.print("Quali elementi vorresti visualizzare? (separati da virgola): ");
       in.nextLine();
       String elementiScelti = in.nextLine();
    }
    Un po' spartana come soluzione, ma almeno funge

    P.S.: conoscete soluzioni migliori?

  6. #6
    Originariamente inviato da Simo990
    P.S.: conoscete soluzioni migliori?
    Usa solo nextLine()/next() e fai il cast.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.