পরের () বা নেক্সটফু () ব্যবহার করার পরে স্ক্যানার নেক্সটলাইন () এড়িয়ে চলেছে?


684

আমি Scannerপদ্ধতিগুলি nextInt()এবং nextLine()ইনপুট পড়ার জন্য ব্যবহার করছি ।

দেখে মনে হচ্ছে:

System.out.println("Enter numerical value");    
int option;
option = input.nextInt(); // Read numerical value from input
System.out.println("Enter 1st string"); 
String string1 = input.nextLine(); // Read 1st string (this is skipped)
System.out.println("Enter 2nd string");
String string2 = input.nextLine(); // Read 2nd string (this appears right after reading numerical value)

সমস্যাটি হ'ল সংখ্যাসূচক মানটি প্রবেশ করার পরে, প্রথমটি input.nextLine()এড়িয়ে যায় এবং দ্বিতীয়টি input.nextLine()কার্যকর হয়, যাতে আমার আউটপুটটি দেখতে এই রকম হয়:

Enter numerical value
3   // This is my input
Enter 1st string    // The program is supposed to stop here and wait for my input, but is skipped
Enter 2nd string    // ...and this line is executed and waits for my input

আমি আমার অ্যাপ্লিকেশন পরীক্ষা করেছি এবং দেখে মনে হচ্ছে সমস্যাটি ব্যবহারের মধ্যে রয়েছে input.nextInt()। যদি আমি এটি মুছে ফেলি তবে উভয়ই string1 = input.nextLine()এবং string2 = input.nextLine()আমি যেমন হতে চাই তেমন কার্যকর করা হয়।


5
অথবা আপনি আমার মতো হতে পারেন এবং বাফার্ডারিডার ব্যবহার করতে পারেন :) এটি পুরানো স্কুল কিনা আমি তা চিন্তা করি না, এটি সর্বদা কাজ করেছে এবং সর্বদা আমার জন্য কাজ করবে। এছাড়াও, বাফারডারার জ্ঞানের অন্য কোথাও প্রয়োগ রয়েছে। আমি কেবল স্ক্যানার পছন্দ করি না।
ক্রাঙ্কার

উত্তর:


831

কারণ এই Scanner.nextIntপদ্ধতিটি "প্রবেশ করান" টিপুন দিয়ে তৈরি করা আপনার ইনপুটটিতে নতুনলাইন চরিত্রটি পড়বে না এবং তাই Scanner.nextLineসেই লাইনটি পড়ার পরে কলটি ফিরে আসে ।

আপনি Scanner.nextLineপরে Scanner.next()বা যে কোনও Scanner.nextFooপদ্ধতি ব্যবহার করার সময় ( nextLineনিজে ব্যতীত ) একইরকম আচরণের মুখোমুখি হবেন ।

কার্যসংক্রান্ত:

  • হয় Scanner.nextLineপ্রতিটি পরে একটি কল রাখুন Scanner.nextIntবা নিউলাইনScanner.nextFoo সহ সেই লাইনের বাকী অংশ গ্রহন করুন

    int option = input.nextInt();
    input.nextLine();  // Consume newline left-over
    String str1 = input.nextLine();
  • বা, আরও ভাল, এর মাধ্যমে ইনপুটটি পড়ুন Scanner.nextLineএবং আপনার ইনপুটটিকে আপনার প্রয়োজনীয় যথাযথ ফর্ম্যাটে রূপান্তর করুন। উদাহরণস্বরূপ, আপনি Integer.parseInt(String)পদ্ধতিটি ব্যবহার করে একটি পূর্ণসংখ্যায় রূপান্তর করতে পারেন ।

    int option = 0;
    try {
        option = Integer.parseInt(input.nextLine());
    } catch (NumberFormatException e) {
        e.printStackTrace();
    }
    String str1 = input.nextLine();

4
@blekione। আপনাকে ব্যবহার করতে হবে try-catch, কারণ এটিতে যখন কোনও অবৈধ যুক্তি প্রেরণ করা হয় তখন Integer.parseIntছুড়ে দেয় NumberFormatException। আপনি পরে ব্যতিক্রম সম্পর্কে শিখতে হবে। EG এর জন্য: - Integer.parseInt("abc")। আপনি কি "এবিসি" ইন্ট রাইটে রূপান্তর করতে চান না?
রোহিত জৈন

3
@blekione। সুতরাং, উপরের ক্ষেত্রে, আপনার কোডটি সেই সময়ে থামবে, এবং আপনি কার্যকর করতে পারবেন না continue ব্যতিক্রম হ্যান্ডলিংয়ের সাথে আপনি এই জাতীয় শর্তটি পরিচালনা করতে পারেন।
রোহিত জৈন

4
পরেরটি কতটা উত্তম? আফাইক স্ক্যানার # নেক্সটআইন্ট () গ্রুপ কমা এবং স্থানীয় উপসর্গ এবং প্রত্যয়কে মঞ্জুর করে সঠিক ইনটগুলি সন্ধান করতে আরও লম্বা। পূর্ণসংখ্যা # পার্সেইন্ট () কেবলমাত্র অঙ্ক এবং দশমিক বিন্দু প্লাস একটি alচ্ছিক চিহ্নের অনুমতি দেয়।
মর্দচাই

5
আমি ব্যক্তিগতভাবে Scanner#hasNextFooচেষ্টা-ক্যাচের পরিবর্তে আগেই চেক পছন্দ করি তবে এটিও কার্যকর হয়।
মাইল্ডলি মিল্কিওয়েস্ট

1
ব্যবহারের পার্সডুবলে একটি নতুন সমস্যা রয়েছে, এটি পরেরডাবল দশমিক (। বা,) আঞ্চলিক কনফিগারেশন ব্যবহার করে তবে পার্সেডুবল সর্বদা মার্কিন দশমিক (।) পান।
ওলমার্গ 21

209

সমস্যাটি ইনপুট.এনেক্সট ইন্ট () পদ্ধতিটির সাথে থাকে - এটি কেবল ইনট মানটি পড়ে। সুতরাং আপনি যখন ইনপুট.অনেক্সটলাইন () দিয়ে পড়া চালিয়ে যান আপনি "\ n" এন্টার কীটি পান। সুতরাং এড়াতে আপনাকে ইনপুট.নেস্টলাইন () যুক্ত করতে হবে । আশা করি এটি এখন পরিষ্কার হওয়া উচিত।

এটির মতো চেষ্টা করুন:

System.out.print("Insert a number: ");
int number = input.nextInt();
input.nextLine(); // This line you have to add (It consumes the \n character)
System.out.print("Text1: ");
String text1 = input.nextLine();
System.out.print("Text2: ");
String text2 = input.nextLine();

উম্মুকে একটি সমাধান বলে মনে হচ্ছে, এড়িয়ে যাওয়া লাইনটি অ-ব্যবহৃত হয়েছে nextLine, তবে এখনও আমার এই আচরণের ব্যাখ্যা দরকার
Eng.Fouad

2
অবগতির জন্য: থেকে মার্জ করা হয়েছে stackoverflow.com/questions/7056749/...
Shog9

প্রশ্ন: 27 ই অক্টোবর '12 এ 16:37 এ জিজ্ঞাসা করা হয়েছে? আগস্ট 14 '11 এ 12:24 এ উত্তর। এটি কীভাবে সম্ভব?
অপুরভ পাটনে

79

কারণ আপনি যখন কোনও নম্বর প্রবেশ করেন তখন চাপুন Enter, input.nextInt()কেবল "লাইনের শেষ" নয়, সংখ্যাটি গ্রহন করেন। যখন কার্যকর হয় input.nextLine(), এটি প্রথম ইনপুট থেকে বাফারে থাকা "লাইনের শেষ" গ্রাস করে।

পরিবর্তে, input.nextLine()অবিলম্বে ব্যবহার করুনinput.nextInt()


7
@ ভিক্টর এটি বাগ নয়। এটি নির্দিষ্ট হিসাবে কাজ করছে। আপনি তর্ক করতে পারেন যদিও এপিআইকে বলার সহজ উপায় হওয়া উচিত টার্গেটের ইনপুট অনুসরণ করে যে কোনও সাদা স্থান গ্রহণ করা consume
বোহেমিয়ান

আমি দেখি. ধন্যবাদ @ বোহেমিয়ান, আমি ঠিক তর্ক করছি। আমি মনে করি এটি পরিবর্তন করা উচিত, পরবর্তী জেএসপিতে এই "সমস্যা" কোথায় সুপারিশ করবেন তা সম্ভবত আপনি আমাকে নির্দেশ করতে পারেন।
ভিক্টর

@ ভিক্টর আপনি একটি বাগ রিপোর্ট করুন বা কোনও বৈশিষ্ট্য পৃষ্ঠার অনুরোধের মাধ্যমে কোনও বৈশিষ্ট্যটির জন্য অনুরোধ করতে (এবং কীভাবে কোডটি অবদান করবেন তা সন্ধান করতে পারেন) can
বোহেমিয়ান

অবগতির জন্য: থেকে মার্জ করা হয়েছে stackoverflow.com/questions/7056749/...
Shog9

48

এই সমস্যাটি নিয়ে অনেক প্রশ্ন রয়েছে বলে মনে হচ্ছে java.util.Scanner। আমি মনে করি কল scanner.skip("[\r\n]+")করার পরে যে কোনও নিউলাইন অক্ষর ফেলে দেওয়ার জন্য কল করা আরও একটি পঠনযোগ্য / মুশকিল সমাধান nextInt()

সম্পাদনা: @ পেট্রিকপার্কার নীচে উল্লিখিত হিসাবে, যদি ব্যবহারকারী সংখ্যার পরে কোনও শ্বেত স্পেস প্রবেশ করে তবে এটি একটি অসীম লুপ তৈরি করবে। এড়াতে আরও ভাল প্যাটার্ন ব্যবহারের জন্য তাদের উত্তরটি দেখুন: https://stackoverflow.com/a/42471816/143585


অবগতির জন্য: থেকে মার্জ করা হয়েছে stackoverflow.com/questions/7056749/...
Shog9

বাফারে ডেটা অপসারণ করতে আমরা কী জানি আমি তা জানি তবে এই ক্ষেত্রে দয়া করে এটি আমাকে সহায়তা করুন: স্ট্যাকওভারফ্লো
৩৩৫৫৫৩১৪

1
এফওয়াইআই, এটি একটি অনন্ত লুপের কারণ হ'ল সংখ্যার ইনপুট পরে ব্যবহারকারী কোনও ট্যাব বা স্পেস টাইপ করে। আরও ভাল এড়াতে এখানে আমার উত্তর দেখুন: stackoverflow.com/a/42471816/7098259
প্যাট্রিক পার্কার

@ পেট্রিকপার্কার: এটি প্রকৃতপক্ষে একটি অসীম লুপ ঘটায়! ধন্যবাদ, আপনার লিঙ্কটির উত্তর সম্পাদনা করেছেন।
ডেনিস তুলসকি

33

এটা যে কারণ input.nextInt(); নিউলাইনটি ক্যাপচার করে না। আপনি input.nextLine();নীচের অংশে যোগ করে প্রস্তাবিত অন্যদের মতো করতে পারেন ।
বিকল্পভাবে আপনি এটি সি # স্টাইল করতে পারেন এবং এর মতো একটি পূর্ণসংখ্যার পরবর্তী লাইনটি পার্স করতে পারেন:

int number = Integer.parseInt(input.nextLine()); 

এটি করা ঠিক তেমনি কাজ করে এবং এটি আপনাকে কোডের একটি লাইনও বাঁচায়।


অবগতির জন্য: থেকে মার্জ করা হয়েছে stackoverflow.com/questions/7056749/...
Shog9

1
আপনি এখানে চেষ্টা চেষ্টা ব্যবহার করতে হবে। ইনপুটটি সংখ্যা না হলে কী হবে। এখানে নাম্বার ফর্ম্যাট এক্সেপশন হ্যান্ডেল করা দরকার।
অরুণদেব

এটি ধরে নিয়েছে যে আপনি প্রতিটি লাইনে এটির জন্য একটিমাত্র ইনট টোকন রয়েছে।
cellepo

25

টিএল; ডিআর 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#nextTypeSystem.inage । আমাদের যা মনে রাখা দরকার তা হ'ল স্ক্যানার সমস্ত পদ্ধতি সর্বদা ক্যাশেড পাঠ্য থেকে শুরু করে স্ক্যান করে।

লাইন বিভাজক (বা প্রবাহের শেষ) না পাওয়া পর্যন্ত এখন 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


14

input.nextLine()ব্যবহারের পরিবর্তে input.next(), এটি সমস্যার সমাধান করা উচিত।

সংশোধিত কোড:

public static Scanner input = new Scanner(System.in);

public static void main(String[] args)
{
    System.out.print("Insert a number: ");
    int number = input.nextInt();
    System.out.print("Text1: ");
    String text1 = input.next();
    System.out.print("Text2: ");
    String text2 = input.next();
}

অবগতির জন্য: থেকে মার্জ করা হয়েছে stackoverflow.com/questions/7056749/...
Shog9

13

আপনি যদি উভয় স্ট্রিং এবং ইনট পড়তে চান তবে একটি সমাধান হ'ল দুটি স্ক্যানার ব্যবহার করা:

Scanner stringScanner = new Scanner(System.in);
Scanner intScanner = new Scanner(System.in);

intScanner.nextInt();
String s = stringScanner.nextLine(); // unaffected by previous nextInt()
System.out.println(s);

intScanner.close();
stringScanner.close();

1
এই আমি এখন কিছু সময়ের জন্য সন্ধান করছিলাম। বুদ্ধিমান পদক্ষেপ!
লিয়াম উইলসন

1
@ বিডলিয়ারের scanner.nextLine()কাজ করা উচিত।
আন্দ্রে ভ্যালেন্টি

11

আপনি যদি পরের লাইনে () পদ্ধতিতে স্ক্যানার ক্লাসে বিভ্রান্ত না হয়ে দ্রুত ইনপুট স্ক্যান করতে চান তবে এর জন্য কাস্টম ইনপুট স্ক্যানার ব্যবহার করুন।

কোড:

class ScanReader {
/**
* @author Nikunj Khokhar
*/
    private byte[] buf = new byte[4 * 1024];
    private int index;
    private BufferedInputStream in;
    private int total;

    public ScanReader(InputStream inputStream) {
        in = new BufferedInputStream(inputStream);
    }

    private int scan() throws IOException {
        if (index >= total) {
            index = 0;
            total = in.read(buf);
            if (total <= 0) return -1;
        }
        return buf[index++];
    }
    public char scanChar(){
        int c=scan();
        while (isWhiteSpace(c))c=scan();
        return (char)c;
    }


    public int scanInt() throws IOException {
        int integer = 0;
        int n = scan();
        while (isWhiteSpace(n)) n = scan();
        int neg = 1;
        if (n == '-') {
            neg = -1;
            n = scan();
        }
        while (!isWhiteSpace(n)) {
            if (n >= '0' && n <= '9') {
                integer *= 10;
                integer += n - '0';
                n = scan();
            }
        }
        return neg * integer;
    }

    public String scanString() throws IOException {
        int c = scan();
        while (isWhiteSpace(c)) c = scan();
        StringBuilder res = new StringBuilder();
        do {
            res.appendCodePoint(c);
            c = scan();
        } while (!isWhiteSpace(c));
        return res.toString();
    }

    private boolean isWhiteSpace(int n) {
        if (n == ' ' || n == '\n' || n == '\r' || n == '\t' || n == -1) return true;
        else return false;
    }

    public long scanLong() throws IOException {
        long integer = 0;
        int n = scan();
        while (isWhiteSpace(n)) n = scan();
        int neg = 1;
        if (n == '-') {
            neg = -1;
            n = scan();
        }
        while (!isWhiteSpace(n)) {
            if (n >= '0' && n <= '9') {
                integer *= 10;
                integer += n - '0';
                n = scan();
            }
        }
        return neg * integer;
    }

    public void scanLong(long[] A) throws IOException {
        for (int i = 0; i < A.length; i++) A[i] = scanLong();
    }

    public void scanInt(int[] A) throws IOException {
        for (int i = 0; i < A.length; i++) A[i] = scanInt();
    }

    public double scanDouble() throws IOException {
        int c = scan();
        while (isWhiteSpace(c)) c = scan();
        int sgn = 1;
        if (c == '-') {
            sgn = -1;
            c = scan();
        }
        double res = 0;
        while (!isWhiteSpace(c) && c != '.') {
            if (c == 'e' || c == 'E') {
                return res * Math.pow(10, scanInt());
            }
            res *= 10;
            res += c - '0';
            c = scan();
        }
        if (c == '.') {
            c = scan();
            double m = 1;
            while (!isWhiteSpace(c)) {
                if (c == 'e' || c == 'E') {
                    return res * Math.pow(10, scanInt());
                }
                m /= 10;
                res += (c - '0') * m;
                c = scan();
            }
        }
        return res * sgn;
    }

}

সুবিধাদি :

  • বাফারিডারের চেয়ে দ্রুত ইনপুট স্ক্যান করে
  • সময়ের জটিলতা হ্রাস করে
  • প্রতিটি পরবর্তী ইনপুট জন্য ফ্লাশ বাফার

পদ্ধতি:

  • স্ক্যানচর () - একক অক্ষর স্ক্যান করুন
  • স্ক্যানইন্ট () - পূর্ণসংখ্যার মান স্ক্যান করুন
  • স্ক্যানলং () - দীর্ঘ মূল্য স্ক্যান করুন
  • স্ক্যানস্ট্রিং () - স্ট্রিংয়ের মান স্ক্যান করুন
  • স্ক্যানডুবল () - ডাবল মান স্ক্যান করুন
  • স্ক্যানইন্ট (int [] অ্যারে) - সম্পূর্ণ অ্যারে স্ক্যান (পূর্ণসংখ্যা)
  • স্ক্যানলং (দীর্ঘ [] অ্যারে) - সম্পূর্ণ অ্যারে স্ক্রিন (দীর্ঘ)

ব্যবহার:

  1. আপনার জাভা কোডের নীচে প্রদত্ত কোডটি অনুলিপি করুন।
  2. প্রদত্ত শ্রেণীর জন্য বিষয়টির সূচনা করুন

ScanReader sc = new ScanReader(System.in); ৩. প্রয়োজনীয় ক্লাস আমদানি করুন:

import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; 4. ব্যতিক্রম হ্যান্ডেল করতে আপনার প্রধান পদ্ধতি থেকে আইওএক্সেপশন নিক্ষেপ করুন 5. সরবরাহিত পদ্ধতিগুলি ব্যবহার করুন। 6. উপভোগ করুন

উদাহরণ:

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
class Main{
    public static void main(String... as) throws IOException{
        ScanReader sc = new ScanReader(System.in);
        int a=sc.scanInt();
        System.out.println(a);
    }
}
class ScanReader....

10

সমস্যাটি এড়াতে, nextLine();তাত্ক্ষণিকভাবে ব্যবহার করুন nextInt();কারণ এটি বাফারটি সাফ করতে সহায়তা করে। যখন আপনি টিপুন নতুন লাইন ক্যাপচার না এবং অত: পর, অগ্রাহ্য কোড পরে।ENTERnextInt();Scanner

Scanner scanner =  new Scanner(System.in);
int option = scanner.nextInt();
scanner.nextLine(); //clearing the buffer


5

আমি অনুমান করি পার্টিতে আমি অনেক দেরি করেছি ..

আগেই বলা হয়েছে, input.nextLine()আপনার ইনট মান পাওয়ার পরে কল করা আপনার সমস্যার সমাধান করবে। আপনার কোডটি কাজ না করার কারণটি হ'ল কারণ আপনার ইনপুট থেকে (যেখানে আপনি ইনপুটটি ইনপুট করেছিলেন) সংরক্ষণ করার মতো আর কিছুই ছিল না string1। আমি পুরো বিষয়টিতে আরও কিছুটা আলোকপাত করব।

স্ক্যানার ক্লাসে নেক্সটফু () পদ্ধতিগুলির মধ্যে পরের লাইনের () কে বিজোড় হিসাবে বিবেচনা করুন । আসুন একটি দ্রুত উদাহরণ নেওয়া যাক .. আসুন আমরা বলি যে নীচের মতো দুটি কোডের কোড রয়েছে:

int firstNumber = input.nextInt();
int secondNumber = input.nextInt();

যদি আমরা নীচে মান ইনপুট করি (ইনপুটটির একক লাইন হিসাবে)

54 234

আমাদের firstNumberএবং secondNumberভেরিয়েবলের মান যথাক্রমে 54 এবং 234 হয়ে যায়। কারণ এই এই ভাবে কাজ করে কারণ একটি নতুন লাইন ফিড (হয় অর্থাত \ N ) নয় স্বয়ংক্রিয়ভাবে উত্পন্ন যখন nextInt () মেথড মান লাগে। এটি কেবল "নেক্সট ইনট" নেয় এবং এগিয়ে যায়। এটি নেক্সটলাইন () ব্যতীত পরবর্তীFoo () পদ্ধতিগুলির জন্য একই।

পরের লাইনে () একটি মান নেওয়ার সাথে সাথেই একটি নতুন লাইন ফিড তৈরি করে; নতুন লাইন ফিডটি "গ্রাস" হয়েছে বলে @ রোহিতজাইন এর অর্থ এটিই।

শেষ অবধি, পরবর্তী () পদ্ধতিটি কোনও নতুন লাইন তৈরি না করেই নিকটতম স্ট্রিং গ্রহণ করে ; এটি একই একক লাইনের মধ্যে পৃথক স্ট্রিংস গ্রহণের জন্য এটি পছন্দনীয় পদ্ধতি করে তোলে।

আমি আশা করি এটি সাহায্য করে .. মেরি কোডিং!


একটি "নতুন লাইন ফিড" কি?
তীরন্দাজ

@ অ্যাবিসিডি একটি নতুন লাইন ফিডের মূলত অর্থ 'নতুন লাইন থেকে শুরু করা'।
তাসলিম ওসেনি

1
"544 23" উদাহরণটি সত্যই জিনিসগুলিকে স্পষ্ট করে।
অ্যালোনসো ডেল আর্টে

3

একটির পরিবর্তে 2 টি স্ক্যানার অবজেক্ট ব্যবহার করুন

Scanner input = new Scanner(System.in);
System.out.println("Enter numerical value");    
int option;
Scanner input2 = new Scanner(System.in);
option = input2.nextInt();

2
public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int i = scan.nextInt();
        scan.nextLine();
        double d = scan.nextDouble();
        scan.nextLine();
        String s = scan.nextLine();

        System.out.println("String: " + s);
        System.out.println("Double: " + d);
        System.out.println("Int: " + i);
    }

আপনি যদি পরের আইন্ট () পদ্ধতিটি অবিলম্বে নেক্সটলাইন () পদ্ধতিটি ব্যবহার করেন তবে মনে রাখবেন যে পরের আইন্ট () পূর্ণসংখ্যা টোকেন পড়ে; এ কারণে, পূর্ণসংখ্যার ইনপুটটির সেই লাইনটির জন্য সর্বশেষ নিউলাইন চরিত্রটি এখনও ইনপুট বাফারে লাইনযুক্ত রয়েছে এবং পরবর্তী নেক্সটলাইন () পূর্ণসংখ্যার লাইনের অবশিষ্ট অংশটি পড়বে (যা খালি)।
নীরজ গাহলাওয়াত

2

যদি আমি একটি খালি খালি ইনপুট আশা করি

public static Function<Scanner,String> scanLine = (scan -> {
    String s = scan.nextLine();
    return( s.length() == 0 ? scan.nextLine() : s );
  });


উপরের উদাহরণে ব্যবহৃত:

System.out.println("Enter numerical value");    
int option = input.nextInt(); // read numerical value from input

System.out.println("Enter 1st string"); 
String string1 = scanLine.apply( input ); // read 1st string
System.out.println("Enter 2nd string");
String string2 = scanLine.apply( input ); // read 2nd string

2

আমার ইউসকেসগুলির একটিতে আমার কাছে বেশ কয়েকটি পূর্ণসংখ্যার মানগুলির আগে একটি স্ট্রিং মান পড়ার দৃশ্য ছিল । মানগুলি পড়ার জন্য আমাকে একটি " for / while লুপ " ব্যবহার করতে হয়েছিল। এবং উপরোক্ত পরামর্শগুলির মধ্যে একটিও এই ক্ষেত্রে কার্যকর হয়নি।

ব্যবহার input.next()পরিবর্তে input.nextLine()সমস্যা সমাধান করা হয়েছে। আশা করি অনুরূপ দৃশ্যের সাথে যারা ডিল করছেন তাদের জন্য এটি সহায়ক হতে পারে।


2

এই কোডটি ব্যবহার করুন এটি আপনার সমস্যার সমাধান করবে।

System.out.println("Enter numerical value");    
int option;
option = input.nextInt(); // Read numerical value from input
input.nextLine();
System.out.println("Enter 1st string"); 
String string1 = input.nextLine(); // Read 1st string (this is skipped)
System.out.println("Enter 2nd string");
String string2 = input.nextLine(); // Read 2nd string (this appears right after reading numerical value)

2

হিসাবে nextXXX()পদ্ধতি পড়া না newlineছাড়া nextLine()। নীচের মতো ব্যবহার করে আমরা newlineকোনও non-stringমান ( intএই ক্ষেত্রে) পড়ার পরে এড়িয়ে যেতে পারি scanner.skip():

Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
sc.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");
System.out.println(x);
double y = sc.nextDouble();
sc.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");
System.out.println(y);
char z = sc.next().charAt(0);
sc.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");
System.out.println(z);
String hello = sc.nextLine();
System.out.println(hello);
float tt = sc.nextFloat();
sc.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");
System.out.println(tt);

0

কেন প্রতিটি পঠনের জন্য একটি নতুন স্ক্যানার ব্যবহার করবেন না? নীচের মত। এই পদ্ধতির সাহায্যে আপনি আপনার সমস্যার মুখোমুখি হবেন না।

int i = new Scanner(System.in).nextInt();

3
তবে তারপরে Scannerমেমরি ফুটো রোধ করতে আপনাকে বন্ধ করতে হবে। সময় নষ্ট?
দ্য কফিকপ

1
স্ক্যানার কোনও পদ্ধতিতে আবৃত থাকলে কী জিসি তা যত্ন করে না? পছন্দ: স্ট্রিং getInput () new নতুন স্ক্যানার (System.in) ফেরান {
টোবিয়াস জোহানসন

এটি একেবারে ভুল। nextInt()এটি "নতুন" Scannerবা ইতিমধ্যে ব্যবহৃত ব্যবহৃততে নির্বিশেষে নিউলাইনটি গ্রাস করবে না ।
দাউদ ইবনে কেরেম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.