IT

스캐너가 next() 또는 nextFoo()를 사용한 후 nextLine()을 건너뜁니다.

itgroup 2022. 11. 7. 21:28
반응형

스캐너가 next() 또는 nextFoo()를 사용한 후 nextLine()을 건너뜁니다.

는 ★★★★★★★★★★★★★★를 사용하고 있습니다.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()제가 원하는 대로 실행이 됩니다.

그 이유는 이 메서드가 Enter 키를 눌러 작성한 입력의 줄바꿈 문자를 읽지 않기 때문에 줄바꿈을 읽으면 호출이 반환되기 때문입니다.

은 이 동작에서 볼 수 .Scanner.nextLine그 후 또는 어느 쪽인가Scanner.nextFoo( 「 」( 「 」 제외)nextLine그자자)

회피책:

  • 를 a를 넣거나Scanner.nextLine Scanner.nextInt ★★★★★★★★★★★★★★★★★」Scanner.nextFoo뉴라인을 포함한 나머지 라인을 소비하다

    int option = input.nextInt();
    input.nextLine();  // Consume newline left-over
    String str1 = input.nextLine();
    
  • 더 것은, 더 좋은 것은, 을 통해 입력 것입니다.Scanner.nextLine입력 내용을 필요한 형식으로 변환합니다.예를 들어 메서드를 사용하여 정수로 변환할 수 있습니다.

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

input.nextInt() 메서드에 문제가 있습니다.이 메서드는 int 값만 읽습니다.따라서 input.nextLine()을 사용하여 계속 읽으면 "\n" Enter 키를 받게 됩니다.이를 건너뛰려면 input.nextLine()을 추가해야 합니다.이제 분명해졌으면 좋겠다.

이렇게 해보세요.

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();

왜냐하면 번호를 입력하고 을 누르면input.nextInt()는 숫자만 소비하고 "줄 끝"은 소비하지 않습니다.input.nextLine()를 실행하여 첫 번째 입력부터 버퍼 내의 "엔드 오브 라인"을 소비합니다.

''를 합니다.input.nextLine()input.nextInt()

것 같아요.java.util.Scanner보다 읽기 쉽고 자동적인 해결책은 전화하는 것이라고 생각합니다.scanner.skip("[\r\n]+") nextInt().

편집: @PatrickParker가 아래에 기술한 바와 같이 사용자가 숫자 뒤에 공백을 입력하면 무한 루프가 발생합니다.skip에서 사용하는 보다 나은 패턴에 대해서는http://https://stackoverflow.com/a/42471816/143585 를 참조해 주세요.

이유는 '아예'이기 때문입니다.input.nextInt(); 하다, 이렇게 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다를 다른 처럼 할 수요.input.nextLine();★★★★★★★★★★★★★★★★★★.
C을 다음과 같은할 수 .「 C # 」 、 「 nextLine 」

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

이 조작도 마찬가지로 동작해, 일련의 코드를 절약할 수 있습니다.

TL;DR
scanner.skip("\\R?") 전에scanner.nextLine()이전 명령이 다음과 같았는지 확실하지 않은 경우scanner.next() ★★★★★★★★★★★★★★★★★」scanner.next*TypeName*().

skip 를 사용합니다.서 regex 는 regex 입니다.

  • \R는 행 (행 구분 기호)를 .

  • ? 수 있다\Roptional - " " " ( " " " " ) - " " " " 를 합니다.skip from method method 。

    (a) 일치하는 시퀀스를 기다리는 중 - 다음과 같은 데이터 소스가 아직 열려 있는 경우System.in
    던지기 (b) 던지기java.util.NoSuchElementException종료/폐쇄된 데이터 소스 및 전송된 데이터가 건너뛸 내용과 일치하지 않는 경우

알아야 할 사항:

  • 몇 줄의 행을 나타내는 텍스트에는, 행간에 인쇄할 수 없는 문자(행 구분 문자라고 부릅니다)도 포함되어 있습니다.

  • 리턴- 됨)(CR - 자 (alsalsalsalsals 。"\r")

  • Feed; Line Feed(LF; 라인 피드)로 리터럴 내) - Line Feed(LF; 라인 피드)"\n")

  • 콘솔에서 데이터를 읽을 때 사용자는 응답을 입력할 수 있으며, 작업이 끝나면 어떤 식으로든 그 사실을 확인해야 합니다.그러기 위해서는 키보드에서 "Enter"/"return" 키를 눌러야 합니다.

중요한 것은 사용자 데이터를 표준 입력에 확실하게 배치하는 것 외에 이 키를 사용하는 것입니다.System.in 읽습니다.Scanner OS 행 의 등)도합니다.\r\n을 클릭합니다을 클릭합니다.

때, 예를 들어 '가치'를 물어보면age 및 키를 에는 Enter가 "42\r\n".

문제

Scanner#nextInt 기타)Scanner#nextTypemethods)에서는, 스캐너가 이러한 행 구분 기호를 사용할 수 없습니다.에서 읽어낼 것이다.System.in로부터 (「」 「」 「」 「」 「」 「」 「」)를 알 수 있을까요?age(공백에 접하는 것보다 더 큰 가치)표준 입력에서는 삭제되지만 회선 구분 기호도 내부적으로 캐시됩니다.우리가 기억해야 할 것은 모든 스캐너 방법은 항상 캐시된 텍스트에서 시작하여 스캔된다는 것입니다.

, 이제Scanner#nextLine()는 행 구분자(또는 스트림의 끝)를 찾을 까지 모든 문자를 수집하여 반환합니다.그러나 콘솔에서 번호를 읽은 후 행 구분 기호는 스캐너의 캐시에서 즉시 발견되므로 빈 문자열을 반환합니다. 즉, 행 구분 기호는 스캐너가 해당 행 구분 기호(또는 스트림 끝) 앞에 아무런 문자도 찾을 수 없었음을 의미합니다.
の b b b 。nextLine는 이러한 회선 구분 기호도 소비합니다.

솔루션

'나', '나', '나', '나', '나', '나', '나', '나', '나', '나', '나', '나', '나', '나', '나', '나', '나', '나', '나', '나', '나', '나', '나', '나', '나', '나', '나', '나', '나', '나', '나', '나', '나', '나', '나', '나', '나', '나', '나', '나', '나', '나'나', '나', '나', '나',nextLine 중 하나, 느 ,

  • nextInt cache by 캐 from from from from from
  • , " "nextLine ,
  • 또는 IMO가 더 읽기 쉬운 방법은 전화하는 것입니다.skip("\\R") ★★★★★★★★★★★★★★★★★」skip("\r\n|\r|\n")을 스캐너로 은 " " "에 대한 정보").\R: https://stackoverflow.com/a/31060125)
  • 않다nextInt (비활성화)next 임의의 「」를 지정합니다.nextTYPE메서드)를 사용합니다., 이 자료 를 한 줄 한 읽어보세요.nextLine한를 해석하여 "1개의 행에 1개의 숫자만 포함)와 같은 .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.

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();
}

문자열과 int를 모두 읽고 싶은 경우는, 다음의 2개의 스캐너를 사용합니다.

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();

하려면 , 「」를 사용합니다.nextLine();nextInt();버퍼를 제거하는 데 도움이 됩니다.★★★★★★★★★★★★★★를 누르면,ENTERnextInt(); 「New Line」은 합니다.Scanner나중에 코드를 입력합니다.

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

Scanner 클래스의 nextLine() 메서드를 혼동하지 않고 입력을 빠르게 스캔하려면 [Custom Input Scanner]를 사용합니다.

코드:

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;
    }

}

장점:

  • BufferReader보다 빠르게 입력 스캔
  • 시간 복잡성 경감
  • 다음 입력마다 버퍼 플러시

방법:

  • scanChar() - 단일 문자 검색
  • scanInt() - 스캔 정수값
  • scan Long() - 긴 값을 스캔합니다.
  • scanString() - 검색 문자열 값
  • scan Double() - 더블 값을 스캔합니다.
  • scanInt(int[] array - 어레이 전체를 스캔합니다(Integer).
  • scanLong(long[] 배열) - 전체 배열(long)

사용방법:

  1. Java 코드 아래에 지정된 코드를 복사합니다.
  2. 지정된 클래스의 개체 초기화

ScanReader sc = new ScanReader(System.in); 클래스 : 3. 필요한 클래스 가져오기:

import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; 4. 54를 합니다. IOException 5개입니다.방법을 6. . 6. 즐기세요. 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....

sc.nextLine()을 사용하다퍼포먼스가 뛰어나기 때문에 좋습니다.

파티에 좀 늦은 것 같아요.

바와 같이, 「」를 발신하고 .input.nextLine()인트하지 않는 에서 int로 할 수 있는 입니다.string1조금 더 주제 전체에 대해 설명하겠습니다.

nextLine()은 스캐너 클래스의 nextFoo() 메서드 중 홀수인 것으로 간주합니다.간단한 예를 들어보겠습니다.예를 들어 다음과 같은 코드 행이 2개 있다고 합시다.

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

아래 값을 입력하면(한 줄로 입력)

54 234

델의 ★★★의 firstNumber ★★★★★★★★★★★★★★★★★」secondNumber변수는 각각 54와 234가 됩니다.이것이 이렇게 동작하는 이유는 nextInt() 메서드가 값을 가져올 때 새로운 줄바꿈(\n)이 자동으로 생성되지 않기 때문입니다."next int"를 사용하여 다음 단계로 넘어갑니다.이는 nextLine()을 제외한 나머지 nextFoo() 메서드에서도 동일합니다.

nextLine()은 값을 취득한 직후에 새로운 회선 피드를 생성합니다.이것은 @RohitJain이 새로운 회선 피드를 「소비」하고 있는 것을 의미합니다.

마지막으로 next() 메서드는 새로운 행을 생성하지 않고 가장 가까운 스트링을 사용할 뿐입니다.이것에 의해, 같은 행내에서 다른 스트링을 취득하는 경우에 우선되는 방식이 됩니다.

이게 도움이 됐으면 좋겠는데..메리 코딩!

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);
    }

입력이 비어있지 않은 경우

디세이블로그:
– 다음 입력이 체크되지 않은 경우 데이터 손실scan.nextLine()
됩니다. - 부부 、 부 because 、 – because 、 – – because because – – – 。scan.nextLine()에 의해 대체되었습니다.scan.next() yeah이피 : "yppie ya yeah" (예: "yppie ya yeah")
Exception 시 " " " " 。Scannermethods(먼저 읽고 나중에 해석)

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

1개의 스캐너 오브젝트 대신 2개의 스캐너 오브젝트 사용

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

제 사용 사례 중 하나에서는 문자열에 몇 의 정수 값을 읽는 시나리오가 있었습니다.값을 읽으려면 "for / while loop"을 사용해야 했습니다.그리고 위의 제안 중 어느 것도 이 경우에는 효과가 없었습니다.

「」를 사용합니다.input.next()input.nextLine()문제를 해결했습니다.이것이 유사한 시나리오를 다루는 사람들에게 도움이 되기를 바랍니다.

~로nextXXX()읽히지 .newline, 제외)nextLine()은할 수 .는 생략할 수 있습니다.newlinenon-stringcalue(calue))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);

이 코드를 사용하면 문제가 해결됩니다.

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)

이 문제를 해결하려면 scan.nextLine()을 작성하십시오.여기서 scan은 Scanner 객체의 인스턴스입니다.예를 들어 설명에는 단순한 HackerRank 문제를 사용하고 있습니다.

package com.company;
import java.util.Scanner;

public class hackerrank {
public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    int i = scan.nextInt();
    double d = scan.nextDouble();
    scan.nextLine(); // This line shall stop the skipping the nextLine() 
    String s = scan.nextLine();
    scan.close();



    // Write your code here.

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

}

nextLine()텍스트를 기다리지 않고 빈 행으로 직접 입력을 읽습니다.

스캐너를 추가해 빈 행을 소비하는 것으로, 심플한 해결 방법:

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)

모든 판독치에 새 스캐너를 사용하면 어떨까요?아래와 같이.이 방법으로는 문제를 해결할 수 없습니다.

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

input.nextInt() 메서드에 문제가 있습니다.이 메서드는 int 값만 읽습니다.따라서 input.nextLine()을 사용하여 계속 읽으면 "\n" Enter 키를 받게 됩니다.이를 건너뛰려면 input.nextLine()을 추가해야 합니다.이제 분명해졌으면 좋겠다.

이렇게 해보세요.

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();

이것은 자바 코드 초보자에게는 매우 기본적인 문제입니다.java(Self Teached)를 시작했을 때 겪었던 것과 같은 문제입니다.실제로 정수 dataType을 입력하면 정수 값만 읽히고 newLine(\n) 문자는 남습니다.이 행(즉, 정수 다이내믹 입력에 의해 새로운 행이 남음)은 새로운 입력을 시도하면 문제를 일으킵니다.예를 들어 정수 입력을 받은 후 String 입력을 시도한 경우 등입니다.

value1=sc.nextInt();
value2=sc.nextLine();

value2는 newLine 문자를 자동으로 읽고 사용자 입력을 받지 않습니다.

해결책: 다음 사용자 입력을 받기 전에 코드 한 줄만 추가하면 됩니다.

sc.nextLine();

또는

value1=sc.nextInt();
sc.nextLine();
value2=sc.nextLine();

주의: 메모리 누수를 방지하기 위해 스캐너를 닫는 것을 잊지 마십시오.

언급URL : https://stackoverflow.com/questions/13102045/scanner-is-skipping-nextline-after-using-next-or-nextfoo

반응형