>Java >java지도 시간 >Java의 Scanner.nextLine()에서 캐리지 리턴을 읽는 문제를 해결하는 방법

Java의 Scanner.nextLine()에서 캐리지 리턴을 읽는 문제를 해결하는 방법

PHPz
PHPz앞으로
2023-04-15 09:19:111124검색

문제 설명

Java를 사용하여 키보드 입력을 읽을 때 먼저 int 변수를 읽고 다음 줄의 문자열을 읽으면 프로그램 실행 결과가 예상과 다르며 프로그램이 읽지 못하는 것을 알 수 있습니다. 다음 줄.

다음 상황에서 발생합니다.

Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
String s=sc.nextLine();

문제 분석

코드 분석에서 먼저 int 변수를 입력한 후 다음 줄에 문자열을 입력해야 합니다. 즉, 키보드를 사용할 때입니다. 입력하려면 실제로 세 부분을 입력합니다:

3
words

은 숫자 3, 개행 문자, 문자열 단어입니다.

추가 개행 문자를 처리하는 방법

지금의 분석을 통해 문제의 원인은 nextLine() 메서드가 문자열을 읽지 않고 Enter 개행 문자를 읽는 것임을 알 수 있습니다.

방법 1

추가 줄 바꿈 문자가 있으므로 문자열을 읽기 전에 줄 바꿈 문자를 읽을 수 있습니다.

Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
sc.nextLine();//将换行符读掉
String s=sc.nextLine();

방법 2

스캐너 개체를 다시 만듭니다.

Scanner sc1=new Scanner(System.in);
int n=sc1.nextInt();
Scanner sc2=new Scanner(System.in);
String s=sc2.nextLine();

이 방법으로 n 이후 읽으면 개행 문자가 삭제되고 다음 줄은 sc2가 읽기 시작하는 위치로 간주됩니다.

실전 전투

다음은 Tengxun 회사의 2020년 4월 26일 소프트웨어 관련 직종 여름 인턴십 필기 시험의 첫 번째 문제입니다.

데이터 구조의 기본 중 하나 - 대기열

큐에는 5가지 기본 작업이 있습니다. , 대기열 끝에 삽입, 대기열 헤드 제거, 대기열 헤드 삭제, 대기열 크기 및 대기열 지우기.

이제 대기열 작업을 시뮬레이션할 수 있습니다. 특정 형식에 대한 입력을 참조하세요.

입력 설명:

첫 번째 줄에 정수 T를 입력하면 다음에 테스트 데이터 T 세트가 있음을 나타냅니다.
각 테스트 데이터 세트에 대해:
첫 번째 줄에 정수 Q를 입력하여 Q 연산이 있음을 나타냅니다.
다음 Q 라인에서는 각 라인에 큐 작업 방식이 들어갑니다. 구체적인 형식은 다음과 같습니다.
초기 상태에서는 큐가 비어 있습니다.
큐의 끝 부분 삽입: PUSH 100
1은 작업이 위 5가지 유형 중 하나임을 보장합니다.


출력 설명:

각 테스트 데이터 세트에 대해:
작업이 "팀장 제거"인 경우 팀의 헤드 요소를 출력하고, 꺼낼 수 없는 경우 "-1"을 출력합니다.

작업이 "팀장 삭제"인 경우 삭제할 수 없으면 "-1"을 출력

작업이 "큐 크기"인 경우 대기열 크기를 출력
다른 작업에는 출력할 필요 없음



예제 input

2
7

PUSH 1

PUSH 2
TOP

POP
TOP
POP
POP
5
PUSH 2 , LinkedList 사용 물론, Queue의 기본 구현은 원래 LinkedList입니다.

이 질문을 나열하는 이유는 이 질문이 nextLine() 읽기 실패 문제를 일으킬 수 있기 때문입니다. 먼저 정수 변수 T를 읽어야 하고, 그런 다음 처리하지 않으면 한 줄씩 읽어야 하기 때문입니다. 개행 문제로 인해 프로그램이 비정상적으로 실행될 수 있습니다.

내 AC 답변:

import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc =new Scanner(System.in);
        int t=sc.nextInt();
        while(t>0){
            int q=sc.nextInt();
            List<Integer> n=new LinkedList<>();
            for(int i=0;i<=q;i++){//注意!i<=q,这里的‘=&#39;就是因为q和第一行输入之间的换行符
                String s=sc.nextLine();
                if(s.equals("")){//在这道题中,当我读取到换行符时,直接跳过,不做任何操作
                    continue;
                }
                if(s.startsWith("PUSH")){
                    n.add(Integer.parseInt(s.split(" ")[1]));
                }
                else if(s.equals("TOP")){
                    if(n.size()==0){
                        System.out.println(-1);
                    }
                    else
                        System.out.println(n.get(0));
                }
                else if(s.equals("POP")){
                    if(n.isEmpty()){
                        System.out.println(-1);
                    }
                    else
                        n.remove(0);
                }
                else if(s.equals("SIZE")){
                    System.out.println(n.size());
                }
                else if(s.equals("CLEAR")){
                    n.clear();
                }
            }
            t--;
        }
    }
}

위 코드에서
for(int i=0;i<=q;i++)

를 사용하여 q와 다음 입력 사이에 개행 문자가 있다는 것을 처음으로 발견했습니다.

이후 개행 문자가 나타나면
String s=sc.nextLine();
if(s.equals(""))
    continue;

를 사용하여 문제를 해결하세요.

위 내용은 Java의 Scanner.nextLine()에서 캐리지 리턴을 읽는 문제를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제