
실습 : 0.0~10.0 사이에 원하는 점수 입력 입력한 점수 소수점 뺀 자연수만큼 원하는 문장 입력
입력 끝난 후 입력한 점수, 소수점 뺀 자연수, 입력한 문장들 출력
Scanner scan = new Scanner(System.in);
System.out.println("0.0~10.0까지 점수를 입력하세요");
double score;
while(true) {
score = scan.nextDouble();
if(score < 0.0 || score > 10.0){
System.out.println("점수는 0.0~10.0까지만 입력 가능합니다. 다시 입력해주세요~");
continue;
}
break;
}
int newScore = (int)score;
System.out.println(score + " 미만의 자연수는 " + newScore+" 입니다.");
System.out.println(newScore+ " 번 원하는 문장을 입력해보세요.");
String[] arr = new String[newScore];
for (int i = 0 ; i < newScore ; i++){
arr[i] = i+1 + ". " +scan.nextLine();
}
scan.close();
System.out.println("\n*******************************\n");
System.out.println("입력한 점수 : " + score);
System.out.println("입력한 문장들");
for (String i : arr)
System.out.println(i);
🐛 문제 발생
: 의도한 수 보다 한번 적게 문장을 입력할 수 있었다.
출력도 첫번째 문장이 출력되어야 할 곳에 빈 문자열만 출력되었디.
💡 원인
: nextDouble()은 엔터키를 소비하지 않고 버퍼에 저장해둔다. 따라서 소비되지 않은 엔터키가 다음 번 문장 입력시 nextLine()에서 한번 소비가 되었다.
⛏ 해결 방법
nextLine()으로 엔터키를 먼저 소비해주고 문장을 입력 받는다.
Scanner scan = new Scanner(System.in);
System.out.println("0.0~10.0까지 점수를 입력하세요");
double score;
while(true) {
score = scan.nextDouble();
if(score < 0.0 || score > 10.0){
System.out.println("점수는 0.0~10.0까지만 입력 가능합니다. 다시 입력해주세요~");
continue;
}
break;
}
// 엔터키 소비
scan.nextLine();
int newScore = (int)score;
System.out.println(score + " 미만의 자연수는 " + newScore+" 입니다.");
System.out.println(newScore+ " 번 원하는 문장을 입력해보세요.");
String[] arr = new String[newScore];
for (int i = 0 ; i < newScore ; i++){
arr[i] = i+1 + ". " +scan.nextLine();
}
scan.close();
System.out.println("\n*******************************\n");
System.out.println("입력한 점수 : " + score);
System.out.println("입력한 문장들");
for (String i : arr)
System.out.println(i);
👀
간단한 문제임에도 굳이 남겨놓는 이유는 예전에 같은 실수를 한 적이 있었다. 그때 확실히 알았다고 생각했었는데 같은 실수를 하니까 아쉬운 마음도 크고 반성하게 됐다.
앞으로는 아무리 간단한 문제라도 복습하는 마음으로 남겨놓아야겠다.