java程序无法读取字符串

时间:2017-12-08 08:28:34

标签: java

import java.util.*;

class DataTypes {

    public static void main(String args[]) {
        int i = 4;
        double d= 4.0;
        String s = "Hackerrank";
        Scanner scan = new Scanner(System.in);
        int j = scan.nextInt();
        double d1 = scan.nextDouble();
        String s1 = new String();
        s1 = scan.nextLine();
        j = j+i;
        System.out.println(j);
        d1 = d1+d;
        System.out.println(d1);
        System.out.println(s+" "+s1);
        scan.close();
    }
}

看到上面的代码它没有错误但是在我输入double之后程序没有读取它直接显示输出的字符串。但是当我评论int和double的扫描语句时,程序会读取我的字符串。为什么会这样?

7 个答案:

答案 0 :(得分:6)

您没有按照自己的意愿阅读字符串,只需使用下面的代码即可使其正常工作

s1 = scan.next();

有关详细信息,请参阅此link

编辑:
如果您的输入包含带空格的字符串,则可以执行以下操作:

scan.nextLine();
s1 = scan.nextLine();

这是因为nextDouble(),此方法不会消耗输入的最后一个换行符,因此在下次调用nextLine()时会消耗该换行符。在读取String之前添加newLine()将使用新的Line,您将能够输入String。

答案 1 :(得分:0)

更改此行

s1 = scan.nextLine();

s1 = scan.next();

答案 2 :(得分:0)

试试这个:

import java.util.*;
class Demo{
public static void main(String args[]){
  int i = 4;
  double d= 4.0;
  String s = "Hackerrank";
  Scanner scan = new Scanner(System.in);
  int j = scan.nextInt();
  double d1 = scan.nextDouble();
  String s1  = scan.next();
  j = j+i;
  System.out.println(j);
  d1 = d1+d;
  System.out.println(d1);
  System.out.println(s+" "+s1);
  scan.close();
 }
}

答案 3 :(得分:0)

更改行

 s1 = scan.nextLine();

到下面的行

 s1 = scan.next();

会奏效。

答案 4 :(得分:0)

这是因为你输入:,所以直到获得新行它不能进入​​下一行 所以对于非字符串使用示例:

  

int j = scan.nextInt(); scan.nextLine();

import java.util.*;

class DataTypes {

    public static void main(String args[]) {

        int i = 4;
        double d = 4.0;
        String s = "Hackerrank";
        Scanner scan = new Scanner(System.in);

//      System.out.print("Enter j: ");
        int j = scan.nextInt();
        scan.nextLine();
//      System.out.print("Enter dl: ");
        double d1 = scan.nextDouble();
        scan.nextLine();

        String s1 = new String();
//      System.out.print("Enter s1: ");
        s1 = scan.nextLine();
        j = j + i;
        System.out.println(j);
        d1 = d1 + d;
        System.out.println(d1);
        System.out.println(s + " " + s1);
        scan.close();
    }
}

答案 5 :(得分:0)

将此行替换为

double d1 = Double.parseDouble(scan.nextLine());

答案 6 :(得分:0)

出现此问题是因为对nextDouble的调用只会消耗数字本身,而不仅仅是后面的换行符。

发生这种情况:

  1. 您的程序要求扫描仪提供新的双
  2. 你给控制台4个字符:0.1\n
  3. 扫描程序从控制台读取,并获取0.1\n
  4. 因为它现在可以计算双尾的结束位置,所以它会将\n推回到它的缓冲区
  5. 您的程序要求扫描仪提供新换行符
  6. 扫描程序从其缓冲区中读取:\n
  7. 由于它找到了一个有效的行结尾,它返回前面的字符串而没有尾随的换行符。
  8. 对此有不同的解决方案:

    在输入中的数字后面直接添加字符串:

    1 3.5I'm a short string
    

    手动使用代码中不需要的行字符:

            double d1 = scan.nextDouble();
            scan.nextLine();
            String s1 = scan.nextLine();
    

    调用next而不是nextLine:

    注意,这一次只消耗1个字

            double d1 = scan.nextDouble();
            String s1 = scan.next();
    

    使用对下一行的调用阅读双精简版:

    这会将您的程序限制为换行符分隔数字,而不是允许任何分隔符:

    int j = Integer.parseInteger(scan.nextLine());
    double d1 = Double.parseDouble(scan.nextLine());
    String s1 =scan.nextLine();