2014-09-03 40 views
0

我是一个新的Java的C++程序员,并且在字符串(或属性或任何类)的字符串中遇到麻烦。基本的Java程序:字符串对象将不会输入

import java.util.Scanner; 
class Student{ 
    String name; 
    static int count=0; 
    int regno; 
    double marks; 
    Student(){ 
     count++; 
    } 
    static void getCount(){ 
     System.out.println("Count is "+count); 
    } 
    void setName(String n1){ 
     name=n1; 
    } 
    void setMarks(double m1){ 
     marks=m1; 
    } 
    void setRegNo(int rno){ 
     regno=rno; 
    } 
    String getName(){ 
     return name; 
    } 
    int getRegNo(){ 
     return regno; 
    } 
    double getMarks(){ 
     return marks; 
    } 
} 
class Demo{ 
    int i; 
    Student s[]=new Student[3]; 
    Scanner in=new Scanner(System.in); 
    Demo(){ 
     for(i=0;i<3;i++){ 
      s[i]=new Student(); 
      System.out.println("Enter name of student "+(i+1)+" :"); 
      s[i].setName(in.nextLine()); 
      System.out.println("Enter Reg. No. of student "+(i+1)+" :"); 
      s[i].setRegNo(in.nextInt()); 
      System.out.println("Enter marks of student "+(i+1)+" :"); 
      s[i].setMarks(in.nextDouble()); 
     } 
    } 
    public void Display(){ 
     System.out.println("Students with marks >70 : "); 
     System.out.println("RegNo\tName\tMarks\t"); 
     for(i=0;i<3;i++){ 
      System.out.println(s[i].getRegNo()+"\t"+s[i].getName()+"\t"+s[i].getMarks()); 
     } 
    } 
} 
class P4{ 
    public static void main(String args[]){ 
     Demo d=new Demo(); 
     d.Display(); 
    } 
} 

输出:

Enter name of student 1 : 
1 
Enter Reg. No. of student 1 : 
1 
Enter marks of student 1 : 
100 
Enter name of student 2 : 
Enter Reg. No. of student 2 : 
2 
Enter marks of student 2 : 
100 
Enter name of student 3 : 
Enter Reg. No. of student 3 : 
3 
Enter marks of student 3 : 
100 
Students with marks >70 : 
RegNo Name Marks 
1 1 100.0 
2  100.0 
3  100.0 

的麻烦: 从for循环的第二次迭代,则直接要求我输入REGNO和标记跳过名称String.I不明白怎么它适用于第一次迭代,但不适用于其他人。请解释我在这里出了什么问题。

回答

1

我的猜测是,它与许多人所遇到的问题是一样的。在C中为scanf,即前一个输入的结束换行符仍然在输入缓冲区中,并且导致nextLine函数将此换行符视为空行。

您需要一种方法在输入字符串之前丢弃前导空格。

+0

大!!工作,只需要用in.next()替换in.nextLine()。 (我希望Scanner的缓冲区清除自己,但它没有) – Shridharshan 2014-09-03 08:21:55

0

in.nextLine()类型后s[i].setMarks(in.nextDouble());

正在发生的事情:

for(i=0;i<3;i++){ 
      s[i]=new Student(); 
      System.out.println("Enter name of student "+(i+1)+" :"); 
      s[i].setName(in.nextLine()); // second time around, you read the newline character 
      System.out.println("Enter Reg. No. of student "+(i+1)+" :"); 
      s[i].setRegNo(in.nextInt());// once you press "enter" here, the newline 
      System.out.println("Enter marks of student "+(i+1)+" :"); 
      s[i].setMarks(in.nextDouble());// once you press "enter" here, the newline character is added to the input stream 
     } 
+0

编辑:不是输入键应该结束in.nextInt()(或in.nextDouble()),并简单地启动一个新的in.nextLine ()而不是以in.nextInt()结尾并插入'\ n'。这就像两个'\ n'字符一个接一个地添加 – Shridharshan 2014-09-03 08:39:49

+0

@ Shridharshan-最后一个“\ n”将在流中。 'nextInt()'跳过第一个。 – TheLostMind 2014-09-03 08:42:25

0

的问题是,你混合nextInt()/nextDouble()nextLine()

当你输入你的int/double时,它后面会跟着一个新行,当你在下一次迭代中调用nextLine()时,它将读取这一新行。

解决方法是在致电nextInt()/nextDouble()后致电nextLine()(并放弃结果)。

下面是一个简单的代码出现此问题(和溶液):

try (Scanner in = new Scanner(System.in)) { 
    System.out.println("Int:"); 
    in.nextInt(); 
    // in.nextLine(); // uncomment to fix the problem 
    System.out.println("Line:"); 
    in.nextLine(); 
} 
+0

很好的解释,但为什么不关闭Java并为每个输入启动一个新的缓冲区?它可能会使事情更加实际。 – Shridharshan 2014-09-03 08:27:59

+0

@Shridharshan它不会为每个输入重新创建一个新的缓冲区,因为你正在重用'in'。如果每次使用'in = new Scanner(System.in);'重新创建一个新的'Scanner',它将重新创建一个新的缓冲区。 – 2014-09-03 08:34:06

+0

@Shridharshan另一件需要考虑的事情是,有时候,你不希望它重新创建一个新的缓冲区(例如:当你从一个文件/另一个命令管道输入),它不是一个好的解决方案默认做“它”。 – 2014-09-03 08:35:21