2011-02-17 7 views
75

java.util.Scanner से अगलीलाइन() विधि का उपयोग करने के दौरान मुझे परेशानी हो रही है।scanner.nextLine का उपयोग करना()

यहाँ मैं क्या करने की कोशिश की है:

import java.util.Scanner; 

class TestRevised { 
    public void menu() { 
     Scanner scanner = new Scanner(System.in); 

     System.out.print("Enter a sentence:\t"); 
     String sentence = scanner.nextLine(); 

     System.out.print("Enter an index:\t"); 
     int index = scanner.nextInt(); 

     System.out.println("\nYour sentence:\t" + sentence); 
     System.out.println("Your index:\t" + index); 
    } 
} 

उदाहरण # 1: के रूप में इरादा इस उदाहरण काम करता है। String sentence = scanner.nextLine();System.out.print("Enter an index:\t"); पर जारी रखने से पहले इनपुट दर्ज करने की प्रतीक्षा करता है।

यह आउटपुट का उत्पादन:

Enter a sentence: Hello. 
Enter an index: 0 

Your sentence: Hello. 
Your index: 0 

// Example #2 
import java.util.Scanner; 

class Test { 
    public void menu() { 
     Scanner scanner = new Scanner(System.in); 

     while (true) { 
      System.out.println("\nMenu Options\n"); 
      System.out.println("(1) - do this"); 
      System.out.println("(2) - quit"); 

      System.out.print("Please enter your selection:\t"); 
      int selection = scanner.nextInt(); 

      if (selection == 1) { 
       System.out.print("Enter a sentence:\t"); 
       String sentence = scanner.nextLine(); 

       System.out.print("Enter an index:\t"); 
       int index = scanner.nextInt(); 

       System.out.println("\nYour sentence:\t" + sentence); 
       System.out.println("Your index:\t" + index); 
      } 
      else if (selection == 2) { 
       break; 
      } 
     } 
    } 
} 

उदाहरण # 2: इस उदाहरण के रूप में इरादा काम नहीं करता। यह उदाहरण थोड़ी देर के लूप का उपयोग करता है और यदि - और संरचना को उपयोगकर्ता को यह चुनने की अनुमति देता है कि क्या करना है। एक बार प्रोग्राम String sentence = scanner.nextLine(); पर पहुंचने के बाद, यह इनपुट की प्रतीक्षा नहीं करता है बल्कि इसके बजाय लाइन System.out.print("Enter an index:\t"); निष्पादित करता है।

Menu Options 

(1) - do this 
(2) - quit 

Please enter your selection: 1 
Enter a sentence: Enter an index: 

कौन सा यह असंभव एक वाक्य में प्रवेश के लिए बनाता है:

यह आउटपुट पैदा करता है।


उदाहरण # 2 इरादे के रूप में क्यों काम नहीं करता है? पूर्व के बीच एकमात्र अंतर। 1 और 2 वह है। 2 में थोड़ी देर लूप और एक और संरचना है। मुझे समझ में नहीं आता क्यों यह scanner.nextInt() के व्यवहार को प्रभावित करता है।

+0

संबंधित: http://stackoverflow.com/questions/4708219/weird-behaviour-with-scannernextfloat –

+0

इस पंक्ति से पहले स्ट्रिंग वाक्य = scanner.nextLine(); नीचे पंक्ति sc.nextLine(); – Bravo

उत्तर

111

मुझे लगता है कि तुम्हारी समस्या है कि

int selection = scanner.nextInt(); 

पढ़ता सिर्फ संख्या, नहीं लाइन या संख्या के बाद कुछ भी का अंत है। जब आप

String sentence = scanner.nextLine(); 

घोषित यह उस पर संख्या के साथ लाइन के शेष

एक scanner.nextLine (रखने) का प्रयास करें (नंबर मुझे लगता है के बाद कुछ भी नहीं के साथ) पढ़ता है; प्रत्येक nextInt() के बाद यदि आप शेष रेखा को अनदेखा करना चाहते हैं।

+3

यह सही है। कैरिज रिटर्न 'nextInt' द्वारा उपभोग नहीं किया जाता है। कामकाज आपके समाधान का उपयोग करना है या सीआर और अन्य डिलीमीटर दोनों को शामिल करने के लिए पैटर्न का उपयोग करना है। –

18

प्रत्येक बार जब आप कुछ पढ़ना चाहते हैं तो अतिरिक्त scanner.nextLine() रखने की बजाय, ऐसा लगता है कि आप एक नई लाइन पर प्रत्येक इनपुट को स्वीकार करना चाहते हैं, तो आप वास्तव में केवल न्यूलाइन से मेल खाने के लिए डिलीमीटर को बदलना चाहते हैं (किसी भी व्हाइटस्पेस के बजाय , के रूप में डिफ़ॉल्ट,

import java.util.Scanner; 

class ScannerTest { 
    public static void main(String[] args) { 
     Scanner scanner = new Scanner(System.in); 
     scanner.useDelimiter("\\n"); 

     System.out.print("Enter an index: "); 
     int index = scanner.nextInt(); 

     System.out.print("Enter a sentence: "); 
     String sentence = scanner.next(); 

     System.out.println("\nYour sentence: " + sentence); 
     System.out.println("Your index: " + index); 
    } 
} 

इस प्रकार, इनपुट की एक पंक्ति को पढ़ने के लिए है) आप केवल scanner.next() समान व्यवहार सीमांकक के लिहाज से अगले {इंट, डबल की है कि जरूरत है, ...}

"nextLine() हर बार" दृष्टिकोण, साथ अंतर यह है कि बाद भी एक सूचकांक <space>3, 3<space> और 3<space>whatever के रूप में, को स्वीकार करेंगे, जबकि पूर्व केवल अपने स्वयं के

3

पर एक लाइन पर 3 स्वीकार करता है या

int selection = Integer.parseInt(scanner.nextLine()); 
7

यह है क्योंकि जब आप एक नंबर तो एंटर दबाएं दर्ज करें, input.nextInt() केवल संख्या, नहीं "पंक्ति के अंत" खपत करता है। Int, double आदि जैसे आदिम डेटा प्रकार "लाइन के अंत" का उपभोग नहीं करते हैं, इसलिए "लाइन का अंत" बफर में रहता है और जब input.next() निष्पादित होता है, तो यह पहले इनपुट से बफर से "रेखा का अंत" का उपभोग करता है। यही कारण है कि, आपके String sentence = scanner.next() केवल "लाइन के अंत" का उपभोग करते हैं और कीबोर्ड से पढ़ने के लिए प्रतीक्षा नहीं करते हैं।

युक्ति: उपयोग scanner.nextLine() बजाय scanner.next() क्योंकि scanner.next() कीबोर्ड से सफेद रिक्त स्थान नहीं पढ़ता। (कीबोर्ड से कुछ जगह देने के बाद स्ट्रिंग को छोटा करें, केवल स्पेस से पहले स्ट्रिंग दिखाएं।)

8

अगलीलाइन() के साथ टेक्स्ट स्कैन करने का प्रयास न करें; उसी स्कैनर के साथ nextInt() का उपयोग करने के बाद! यह जावा स्कैनर के साथ अच्छी तरह से काम नहीं करता है, और कई जावा डेवलपर्स केवल पूर्णांक के लिए एक और स्कैनर का उपयोग करने का विकल्प चुनते हैं। यदि आप चाहें तो इन स्कैनर्स स्कैन 1 और स्कैन 2 को कॉल कर सकते हैं।