扫描仪不读取整个句子 - 扫描仪类的next()和nextLine()之间的差异

时间:2010-10-30 13:35:15

标签: java java.util.scanner

我正在编写一个程序,允许用户输入他的数据然后输出它。它的3/4是正确的但是当它到达输出地址时它只打印一个字,只能说'Archbishop'来自'Archbishop Street'。我该如何解决这个问题?

import java.util.*;

class MyStudentDetails{
    public static void main (String args[]){
        Scanner s = new Scanner(System.in);
        System.out.println("Enter Your Name: ");
        String name = s.next();
        System.out.println("Enter Your Age: ");
        int age = s.nextInt();
        System.out.println("Enter Your E-mail: ");
        String email = s.next();
        System.out.println("Enter Your Address: ");
        String address = s.next();

        System.out.println("Name: "+name);
        System.out.println("Age: "+age);
        System.out.println("E-mail: "+email);
        System.out.println("Address: "+address);
    }
}

24 个答案:

答案 0 :(得分:32)

这种方法很有效,但我不知道如何解释,它是如何运作的。

String s = sc.next();
s += sc.nextLine();

答案 1 :(得分:12)

以这种方式初始化扫描仪,以便使用换行符分隔输入。

Scanner sc = new Scanner(System.in).useDelimiter("\\n");

有关详细信息,请参阅JavaDoc

使用sc.next()获取String中的整行

答案 2 :(得分:11)

我会使用Scanner#nextLine反对next来获取address属性。

  

此方法返回当前行的其余部分,不包括末尾的任何行分隔符。

由于这会返回由行分隔符分隔的整行,它将允许用户输入任何地址而不受任何约束。

答案 3 :(得分:5)

Scanner的默认分隔符是空格。检查javadoc,了解如何更改此内容。

答案 4 :(得分:5)

String s="Hi";
String s1="";

//For Reading Line by hasNext() of scanner 
 while(scan.hasNext()){
  s1 = scan.nextLine();
 }
System.out.println(s+s1);

/*This Worked Fine for me for reading Entire Line using Scanner*/

答案 5 :(得分:4)

不要直接使用System.inSystem.out,而是使用Console类 - 它允许您显示提示并读取输入的整行(从而解决您的问题)拨打:

String address = System.console().readLine("Enter your Address: ");

答案 6 :(得分:2)

next()只能读取输入直到空格。它无法读取由空格分隔的两个单词。此外,next()在读取输入后将光标放在同一行。

nextLine()读取包含单词之间空格的输入(即,它读取到行\n的末尾)。读取输入后,nextLine()将光标定位在下一行。

要阅读整行,您可以使用nextLine()

答案 7 :(得分:2)

exponential仅将输入存储到第一个令牌。如果有两个单词“ Hi there”,则表示有两个用空格分隔的标记(定界符)。每次调用next()方法时,它只会读取一个令牌。

如果输入为“嗨,那里!”

using namespace std;
int exponential_input_array[] = {6,7,16};

class exponential{
  private:
    double a_1;
    double a_2;
    int list[2] = {};

  public:
    exponential(int list_[]){ // <-- same as int* list_ ...
      // cant assign an int* to an int[], so copy the values manually...
      for(int i = 0; i < 2; ++i) { list[i] = list_[i]; }
      or:
      std::copy(list_, list_+2, list);

      a_1 = list_[0];
      a_2 = list_[1];
    }

    int print_data() const {
      cout << "a_1 is: " << a_1 << endl;
      cout << "a_2 is: " << a_2 << endl;
      return 0;
    }
};

int main(){
  exponential exponential_object(exponential_input_array);
  exponential_object.print_data();
}

输出

因此,如果您同时使用这两个单词,则需要再次调用next()以获取下一个对于较长的字符串输入而言效率低下的令牌

另一方面,

Scanner scan = new Scanner(System.in); String str = scan.next() System.out.println(str); 会抓住用户输入的整行,即使有空格也是如此

next()

输出

你好!

答案 8 :(得分:2)

我们可以使用scan.nextLine轻松完成。它将读取剩余的输入直到结束。然后将其分配给您的变量。整个句子可以轻松打印 。以下是您更好理解的示例。

    String s = "HackerRank ";

    Scanner scan = new Scanner(System.in);


    String s2;



    scan.nextLine(); // read the rest of the line of input (newline character after the double token).
    s2 = scan.nextLine();



    /* Concatenate and print the String variables on a new line integer variables on a new line; 

    System.out.println(s + s2);

    scan.close();

} }

答案 9 :(得分:2)

import java.util.Scanner;
public class Solution {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int i = scan.nextInt();
        double d = scan.nextDouble();
        String s="";
        while(scan.hasNext())
        {
            s=scan.nextLine();
        }

        System.out.println("String: " +s);
        System.out.println("Double: " + d);
        System.out.println("Int: " + i);
    }
}

答案 10 :(得分:1)

我尝试了以下代码,但这并没有停止,因为没有中断条件所以它总是在等待输入,可能是你可以为休息添加条件

public class Solution {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int i = scan.nextInt();
        double d = scan.nextDouble();
        String s="";
        while(scan.hasNext())
        {
            s=scan.nextLine();
        }

        System.out.println("String: " +s);
        System.out.println("Double: " + d);
        System.out.println("Int: " + i);
    }
}

答案 11 :(得分:0)

我将令牌分隔符设置为换行符模式,读取下一个令牌,然后将分隔符放回原来的状态。

public static String readLine(Scanner scanner) {
        Pattern oldDelimiter = scanner.delimiter();
        scanner.useDelimiter("\\r\\n|[\\n\\x0B\\x0C\\r\\u0085\\u2028\\u2029]");
        String r = scanner.next();
        scanner.useDelimiter(oldDelimiter);
        return r;
}

答案 12 :(得分:0)

要获得整个地址

s.nextLine();//read the rest of the line as input

System.out.println("Enter Your Address: ");
String address = s.next();

答案 13 :(得分:0)

下面是使用Java Scanner类读取标准输入行的示例代码。

import java.util.Scanner;

public class Solution {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String s = scan.nextLine();
        System.out.println(s);
        scan.close();
    }
}

输入:

  

Hello World

输出:

  

Hello World

答案 14 :(得分:0)

&#34;它只打印一个单词,只允许说#大主教&#39;来自&#39; Archbishop Street&#34;

它只打印这个单词,因为扫描程序的功能如next(),nextInt()等只能在时间读取一个标记。因此,此函数读取并返回下一个标记。

For example if you have: x y z
 s.next() will return x
 s.nextLine() y z

如果你想阅读整行代码,请回到你的代码&#34; Archbishop Street&#34;

String address = s.next(); // s = "Archbishop"
Then address += s.nextLine(); // s = s + " Street"

答案 15 :(得分:0)

下面的代码应该做yoiu正在寻找的东西:

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    String s = scan.nextLine();
    System.out.println(s);
    scan.close();
}

答案 16 :(得分:0)

import java.util.Scanner;

public class Solution {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String s = scan.next();
        s += scan.nextLine();
        System.out.println("String: " + s);

    }
}

答案 17 :(得分:0)

  

java.util.Scanner; util-程序包,Scanner-类

  1. next()读取空格之前的字符串。到达第一个空格后,它无法读取任何内容。
  2. nextLine()读取整行。读取直到该行的末尾或“ / n”。 注意:不是下一行

(示例)

我的人生使命不仅是为了生存,而且要蓬勃发展。

并为此充满热情,同情心和幽默感。

(输出)

  1. 我的

  2. 我的人生使命不仅是为了生存,而且要蓬勃发展;

技巧:

如果要阅读下一行,请检查Java has方法。

while (scanner.hasNext()) {
    scan.next();
}

while (scanner.hasNext()) {
    scan.nextLine();
}

答案 18 :(得分:0)

读取

next()直到遇到相遇空间为止,然后将nextLine()读取到该行的末尾。 Scanner scan = new Scanner(System.in);
String address = scan.next();
s += scan.nextLine();

答案 19 :(得分:0)

Scanner scanner = new Scanner(System.in);
String str = scanner.next();
str += scanner.readLine();

String str = Scanner.next(); ===>它获取该行的第一个单词(hello world!=>“ hello”) str + = Scanner.nextLine(); ===>此方法返回当前行的其余部分,但不包括末尾的任何行分隔符。 (hello world !! =>“ world !!”)

答案 20 :(得分:-1)

我有同样的问题。这应该适合你:

s.nextLine();

答案 21 :(得分:-1)

您也可以使用

var superobjects = [];
var success_callback = function(result) {
  superobjects.push(result);
};
var requests = [];
console.log(data);
for (var i = 0; i < data.length; i++) {
  (function(i, data) {
    requests.push(jQuery.ajax({
      url: wpApiSettings.root + 'superplugin/v1/superdooperendpoint/' + api_key + "/" + data[i].start_date + "/" + data[i].end_date,
      method: 'GET',
      beforeSend: function(xhr) {
        // Set nonce here
        xhr.setRequestHeader('X-WP-Nonce', wpApiSettings.nonce);
      },
      success: function(result) {
        success_callback({
          start_date: data[i].start_date,
          end_date: data[i].end_date,
          span: data[i].span,
          result: result
        });
      }
    }));
  })(i, data);
};
setTimeout(function() {
  console.log(superobjects)
}, 2222);

jQuery.when.apply(undefined, requests).then(function(result) {});

答案 22 :(得分:-2)

使用nextLine()代替next()将句子作为字符串输入。

Scanner sc = new Scanner(System.in);
String s = sc.nextLine();

答案 23 :(得分:-4)

你可以这样做:

class MyStudentDetails{
    public static void main (String args[]){
         Scanner s = new Scanner(System.in);
         System.out.println("Enter Your Name: ");
         String name = s.nextLine();
         System.out.println("Enter Your Age: ");
         String age = s.nextLine();
         System.out.println("Enter Your E-mail: ");
         String email = s.nextLine();
         System.out.println("Enter Your Address: ");
         String address = s.nextLine();


         System.out.println("Name: "+name);
         System.out.println("Age: "+age);
         System.out.println("E-mail: "+email);
         System.out.println("Address: "+address);

    }
}