টিএল; ডিআর scanner.skip("\\R")
প্রতিটি scanner.newLine()
কল করার আগে ব্যবহার করুন , যা পরে কার্যকর করা হয়:
scanner.next()
scanner.next*TYPE*()
পদ্ধতি।
আপনার যে বিষয়গুলি জানতে হবে:
পাঠ্য যা কয়েকটি লাইনের প্রতিনিধিত্ব করে তাতে লাইনের মধ্যে প্রিন্টযোগ্য অক্ষরও রয়েছে (আমরা তাদের লাইন বিভাজক বলি)
- ক্যারেজ রিটার্ন (সিআর - স্ট্রিং আক্ষরিক হিসাবে উপস্থাপিত
"\r"
)
- লাইন ফিড (এলএফ - স্ট্রিং আক্ষরিক হিসাবে উপস্থাপিত
"\n"
)
আপনি যখন কনসোল থেকে ডেটা পড়ছেন তখন এটি ব্যবহারকারীকে তার প্রতিক্রিয়া টাইপ করতে দেয় এবং যখন কাজটি শেষ হয় তার কোনও প্রয়োজনে এই সত্যটি নিশ্চিত করতে হবে। এটি করতে, ব্যবহারকারীর কীবোর্ডে "enter" / "রিটার্ন" কী টিপতে হবে।
গুরুত্বপূর্ণটি হ'ল স্ট্যান্ডার্ড ইনপুটটিতে ব্যবহারকারী ডেটা স্থাপনের বিষয়টি নিশ্চিত করার পাশাপাশি এই কীটি ( System.in
যার দ্বারা পাঠিত হয় Scanner
) ওএস নির্ভর লাইন বিভাজক (উইন্ডোজের মতো) প্রেরণ \r\n
করে।
সুতরাং আপনি যখন ব্যবহারকারীকে পছন্দ মতো মান age
এবং 42 ধরণের ব্যবহারকারী এবং প্রেসগুলি লিখতে বলছেন তখন স্ট্যান্ডার্ড ইনপুট থাকবে "42\r\n"
।
সমস্যা
Scanner#nextInt
(এবং অন্যান্য পদ্ধতি) স্ক্যানারকে এই লাইন বিভাজকগুলিকে গ্রাস করতে দেয় না । এটি এগুলি থেকে পড়বে (স্ক্যানার কীভাবে জানতে পারে যে ব্যবহারকারীর কাছ থেকে এমন কোনও অঙ্ক নেই যা শ্বেত স্পেসের মুখোমুখি হওয়ার চেয়ে মূল্য উপস্থাপন করে ?) যা তাদের স্ট্যান্ডার্ড ইনপুট থেকে সরিয়ে ফেলবে, তবে এটি অভ্যন্তরীণভাবে লাইন বিভাজককেও ক্যাশে করবেScanner#nextType
System.in
age
। আমাদের যা মনে রাখা দরকার তা হ'ল স্ক্যানার সমস্ত পদ্ধতি সর্বদা ক্যাশেড পাঠ্য থেকে শুরু করে স্ক্যান করে।
লাইন বিভাজক (বা প্রবাহের শেষ) না পাওয়া পর্যন্ত এখন Scanner#nextLine()
কেবল সমস্ত অক্ষর সংগ্রহ এবং প্রদান করে। কনসোল থেকে সংখ্যাটি পড়ার পরে লাইন বিভাজকগুলি স্ক্যানারের ক্যাশে তত্ক্ষণাত পাওয়া যায়, এটি খালি স্ট্রিং প্রত্যাবর্তন করে, অর্থাত স্ক্যানার সেই লাইন বিভাজক (বা প্রবাহের শেষ) এর আগে কোনও অক্ষর খুঁজে পেত না।
BTW এছাড়াও হ্রাস ঐ লাইন বিভাজক।
nextLine
সমাধান
সুতরাং যখন আপনি সংখ্যা জিজ্ঞাসা করতে চান এবং তারপরে পুরো লাইনটির জন্য, সেই ফাঁকা স্ট্রিংটি এড়িয়ে যাওয়ার পরেও nextLine
হয়
nextInt
স্ক্যানার্স ক্যাশে থেকে
রেখা বিভাজক দ্বারা বামে ব্যবহার করুন
- ডাক
nextLine
,
- অথবা আইএমও আরও পঠনযোগ্য উপায় হ'ল কল করা
skip("\\R")
বা skip("\r\n|\r|\n")
স্ক্যানারকে লাইন বিভাজকের সাথে মিলিয়ে যাওয়া অংশটি ছেড়ে দেওয়া (আরও তথ্য \R
: https://stackoverflow.com/a/31060125 )
nextInt
(না next
, বা কোনও nextTYPE
পদ্ধতি) মোটেই ব্যবহার করবেন না । পরিবর্তে সমগ্র তথ্য লাইন বাই লাইন ব্যবহার করে পড়া nextLine
এবং প্রতিটি লাইন থেকে পার্স সংখ্যার মত সঠিক টাইপ (এক লাইন অভিমানী শুধুমাত্র একটি সংখ্যা উপস্থিত রয়েছে) int
মাধ্যমে Integer.parseInt
।
বিটিডাব্লু : পদ্ধতিগুলি স্ক্যানার দ্বারা ক্যাশে করা সমস্তগুলি অন্তর্ভুক্তকারী (ট্যাবগুলি, লাইন বিভাজকগুলির মতো ডিফল্টরূপে সমস্ত শ্বেত স্পেসগুলি) এড়িয়ে যেতে পারে , যতক্ষণ না তারা পরের নন-ডিলিমিটার মান (টোকেন) খুঁজে না পাবে। কোড মত ইনপুট জন্য যে ধন্যবাদ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
।