2013-11-14 5 views
0

이 프로그램은 사용자 입력시 대문자가 필요합니다. 입력은 char 변수 c에 저장되고, 그 다음 ascii로 변환 된 다음 대문자인지 확인합니다. 그렇지 않은 경우 프로그램에서 다시 질문해야합니다. 에서 System.out.println 명령 문제 표준시 ("대문자 쓰기 :")은 여러 번 실행되고, 그것은 그 다음과 같습니다"do while"문제

쓰기 대문자 : 쓰기 대문자 : 쓰기 대문자 : 쓰기 대문자 : 대문자 쓰기 :

모든 잘못된 입력 후에 화면에 "대문자 쓰기"를 하나만 갖고 싶습니다. 그리고 ASCII 테이블로 완료해야합니다.

미리 감사드립니다. 조건이 참인 같이 do 블록에 정의 된대로

BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 

int ascii; 
char c; 

do { 
    System.out.println("Write capital letter: "); 
    c = (char) System.in.read();            
    ascii = (int) c;               
} while (ascii < 65 || ascii > 90); 
+0

디버깅을 시도 했습니까? 'while' 문이 발생할 때'c'와'ascii'는 어떤 값을 가지게됩니까? –

+0

실제로'ascii = (int) c; '뒤에'System.out.println (ascii)'와 같은 것을 추가하고 어떤 값을 얻었는지 살펴보십시오. 그런 다음 그 코드가있는 문자를 찾으십시오. –

+1

프롬프트가 여러 번 표시되게하는 원인은 그 한 바이트 (문자)를 읽을 때 줄 바꿈을 포함하여 입력 한 해당 줄의 다른 항목을'System.in'에 남겨 둡니다. – Pietu1998

답변

1
System.out.println("Write capital letter: "); 
do { 
    c = (char) System.in.read();            
    // ascii = (int) c; // not needed if you are using the isUppercase() method   
    if(! Character.isUppercase(c)){ 
    System.out.println("Write capital letter: "); 
    }            
} while (! Character.isUppercase(c)); 

실행된다. 따라서 do 블록에서 한 번만 실행하려는 명령문을 이동하십시오.

+0

그러면'ascii' 변수 전체가 필요 없습니다. – Pietu1998

+0

OP는 여러 번 프롬프트를 원합니다 : "하나만 갖고 싶습니다"대문자 쓰기 : "잘못된 입력이있을 때마다 화면에 표시되며 ASCII 테이블로 완료해야합니다."질문은 왜 더 자주 나타나는지에 대한 것입니다. OP는 그것을 기대합니다. –

+0

@ JoshuaTaylor 이제 좋아 보이니? =) –

0

BufferedReader 변수를 가지고있을 때 왜 System.in.read()을 사용하고 있습니까?

이렇게하면 문제가 해결됩니다. 귀하의 BufferedReader in 변수를 사용하고 있습니다.

while (true) { 
    System.out.println("Write capital letter: "); 
    int b = 0 
    while ((b = in.read()) != -1){ 
     char c = (char) c; 
     if (Character.isUpperCase(c)) break; 
    } 

    //Carry on... 
}