プロが教える店舗&オフィスのセキュリティ対策術

import java.util.Scanner;
import java.util.Random;

class test8{
public static void main(String[] args){
Scanner stdIn=new Scanner(System.in);
Random rand =new Random();

String[] s1={"January","February","March","April","May","June","July","August","September","October","November","December"};


System.out.println("英語の月名を入力してください。\nなお、先頭は大文字で、2文字目以降は小文字とします。");

int n,t;
do{
n=rand.nextInt(12); //nは0~11の乱数
boolean y=false;

while(y==false){
System.out.print(n+1+"月:");
String s2=stdIn.next();

if(s1[n].equals(s2)){
y=true;
}else{
System.out.println("違います。");
}
}
System.out.print("正解です。もう一度? 1…Yes, 2…No:");
t=stdIn.nextInt();
}while(t==1);
System.out.println("終了です。");
}
}


これは正しいプログラムなのですが、
String s2=stdIn.next();
の next() の部分を nextLine() に変えると、

[実行例]
英語の月日を入力してください。
なお、先頭は大文字で、2文字目以降は小文字とします。
11月:November
正解です。もう一度? 1…Yes, 2…No:
1
2月:違います
2月:

という風に、なぜか
2月:違います
という一文が無駄に表示されてしまいます。
なぜなんでしょうか。。

A 回答 (5件)

こちらは参考になりませんか?



http://detail.chiebukuro.yahoo.co.jp/qa/question …
    • good
    • 0
この回答へのお礼

今回のと同じ疑問みたいですね。
なぜ、String s = sc.nextLine(); が入力待ちにならないんですかね。。

ベストアンサーに選ばれてる解答読んでもよく分からないですorz(汗

お礼日時:2011/05/27 19:54

「正解です。

もう一度? 1…Yes, 2…No: 」
のあとの入力をよ~く考えてください. 単に「1」とだけ入力しましたか? そのあと, 何かのキーを打ちませんでしたか?
    • good
    • 0
この回答へのお礼

[1]押した後に[Enter]押した以外には押していません。

お礼日時:2011/05/27 19:52

そう, 「[ENTER] を押した」はずですよね. 「[ENTER] を押す」ということは, 「'\n' という文字を入力する」ということです.



その '\n' が stdIn.nextInt() でどうなるかを考えてください.
    • good
    • 0
この回答へのお礼

int x=sc.nextInt();
で、たとえば2を押してEnter(すなわち改行)を押すと、
scannerは2を読み込んで、
String s=sc.nextLine();の所に来た時点で前回読み込んだ行の次の行をスキャンする?
ということですが、すでにその行は空行なので、入力待ちせずに空行を読み込んだということでしょうか。

つまり、nextLine()メソッドというのはこのプログラム(リンク先の質問者のプログラム)で説明するなら
「前回で読み込んだときにあるスキャナの位置の次の行を読み込む」
ということですかね?
それで次の行はすでに入力されているので、入力待ちにならないということでしょうか?

お礼日時:2011/05/28 00:52

ま~ある意味「nextLine」って名前が悪いんだけどね.... #1 のリンク先にもあるんですが, nextLine で返ってくるのは「現在行の残り」なんです.



2[ENTER]
という入力に対して nextInt を呼び出すと「2」が得られるんだけど, 「入力を終わらせるため」の [ENTER] 自体は消えません. だから, ここで nextLine を呼び出すといきなり [ENTER] を見付けて「これで行が終わった」とばかりいきなり返ってきます.
    • good
    • 0
この回答へのお礼

何度も質問してごめんなさい(汗
次のような場合(両方ともnextLine()メソッド)はうまくいくのですが、
これも最初のnextLineの所で文字入力して[Enter]を押して[Enter]自体は消えず、2つ目のnextLineが
[Enter]見つけるから2つめのnextLineで入力待ちしないと思ったのですが、
この場合はどういうわけなのでしょうか?


import java.util.Scanner;

class test7{
public static void main(String[] args){

Scanner sc = new Scanner(System.in);

System.out.print("sを入力してください");
String s = sc.nextLine();
System.out.println("s=" + s);

System.out.print("tを入力してください");
String t = sc.nextLine();
System.out.println("t=" + t);

}}

お礼日時:2011/05/28 01:57

nextLine は行末の [ENTER] までを返すのですが, この「行末の [ENTER]」そのものも読み込んでいます. しかし, それ自体は不要なので捨てている, ということです.



nextLine が「行末の [ENTER]」を読み捨てることにしないと, 無限ループになっちゃいますよね.
    • good
    • 0
この回答へのお礼

何度も回答していただき、ありがとうございました^^
なんとなく理解できました。もう少しじっくり考えてみます。

お礼日時:2011/05/28 13:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!