टीएल; डीआर scanner.skip("\\R")
प्रत्येक scanner.newLine()
कॉल से पहले उपयोग करें, जिसे बाद में निष्पादित किया जाता है:
scanner.next()
scanner.next*TYPE*()
तरीका।
आपको जिन चीजों की जानकारी होनी चाहिए:
पाठ जो कुछ पंक्तियों का प्रतिनिधित्व करता है, उनमें भी लाइनों के बीच गैर-मुद्रण योग्य वर्ण होते हैं (जैसे हम उन्हें लाइन विभाजक कहते हैं)
- गाड़ी वापसी (सीआर - स्ट्रिंग शाब्दिक के रूप में प्रतिनिधित्व
"\r"
)
- लाइन फ़ीड (LF - स्ट्रिंग शाब्दिक में प्रतिनिधित्व किया
"\n"
)
जब आप कंसोल से डेटा पढ़ रहे होते हैं, तो यह उपयोगकर्ता को अपनी प्रतिक्रिया टाइप करने की अनुमति देता है और जब वह किया जाता है तो उसे किसी भी तरह से इस तथ्य की पुष्टि करने की आवश्यकता होती है। ऐसा करने के लिए, उपयोगकर्ता को कीबोर्ड पर "एन्टर" / "रिटर्न" कुंजी दबाने की आवश्यकता होती है।
यह महत्वपूर्ण है कि उपयोगकर्ता कुंजी को मानक इनपुट ( System.in
जिसके द्वारा पढ़ा जाता है Scanner
) का डेटा रखना सुनिश्चित करने के साथ-साथ \r\n
उसके बाद ओएस निर्भर लाइन विभाजक (जैसे विंडोज के लिए) भी भेजता है।
इसलिए जब आप उपयोगकर्ता से मान पूछ रहे हैं age
, और उपयोगकर्ता प्रकार 42 और प्रेस दर्ज करते हैं, तो मानक इनपुट समाहित होगा "42\r\n"
।
मुसीबत
Scanner#nextInt
(और अन्य विधियाँ) स्कैनर को इन लाइन विभाजकों का उपभोग करने की अनुमति नहीं देता है । यह उनसे पढ़ेगा (कैसे अन्य स्कैनर को पता होगा कि उपयोगकर्ता से अधिक अंक नहीं हैं जो कि व्हाट्सएप का सामना करने की तुलना में मूल्य का प्रतिनिधित्व करते हैं ?) जो उन्हें मानक इनपुट से हटा देगा, लेकिन यह उन लाइन विभाजकों को आंतरिक रूप से कैश भी करेगा । हमें जो याद रखने की आवश्यकता है, वह यह है कि सभी स्कैनर विधियाँ हमेशा कैश्ड पाठ से शुरू होती हैं। Scanner#nextType
System.in
age
अब Scanner#nextLine()
बस सभी वर्णों को इकट्ठा करता है और तब तक लौटाता है जब तक कि उसे लाइन सेपरेटर (या स्ट्रीम का अंत) नहीं मिल जाता है। लेकिन चूंकि कंसोल से संख्या को पढ़ने के बाद लाइन विभाजक स्कैनर के कैश में तुरंत पाए जाते हैं, यह खाली स्ट्रिंग लौटता है, जिसका अर्थ है कि स्कैनर उन रेखा विभाजकों (या धारा के अंत) से पहले किसी भी चरित्र को खोजने में सक्षम नहीं था।
BTW nextLine
भी उन लाइन विभाजकों की खपत करता है ।
समाधान
इसलिए जब आप उस खाली स्ट्रिंग से बचने के लिए नंबर मांगना चाहते हैं, तो पूरी लाइन के लिए nextLine
या तो
- द्वारा
nextInt
स्कैनर्स कैश से बचे लाइन सेपरेटर का उपभोग करें
- कॉलिंग
nextLine
,
- या IMO अधिक पठनीय तरीका होगा कॉल करके
skip("\\R")
या skip("\r\n|\r|\n")
स्कैनर को लाइन विभाजक द्वारा भाग छोड़ दें (के बारे में अधिक जानकारी \R
: https://stackoverflow.com/a/31060125 )
nextInt
(और न ही next
किसी भी nextTYPE
तरीके) का उपयोग न करें । इसके बजाय nextLine
प्रत्येक लाइन से संख्याओं और पार्स संख्याओं का उपयोग करके संपूर्ण डेटा लाइन-बाय-लाइन पढ़ें (मान लें कि एक पंक्ति में केवल एक ही संख्या होती है) उचित प्रकार int
से Integer.parseInt
।
BTW : विधियाँ स्कैनर द्वारा कैश्ड सहित परिसीमाकों (डिफ़ॉल्ट रूप से सभी व्हाट्सएप, लाइन सेपरेटर जैसे) को छोड़ सकती हैं , जब तक कि उन्हें अगला गैर-सीमांकक मान (टोकन) नहीं मिलेगा। कोड जैसे इनपुट के लिए धन्यवादScanner#nextType
"42\r\n\r\n321\r\n\r\n\r\nfoobar"
int num1 = sc.nextInt();
int num2 = sc.nextInt();
String name = sc.next();
ठीक से असाइन करने में सक्षम होगा num1=42
num2=321
name=foobar
।