796

I am using the Scanner methods nextInt() and nextLine() for reading input.

It looks like this:

System.out.println("Enter numerical value");    
int option;
option = input.nextInt(); // Read numerical value from input
System.out.println("Enter 1st string"); 
String string1 = input.nextLine(); // Read 1st string (this is skipped)
System.out.println("Enter 2nd string");
String string2 = input.nextLine(); // Read 2nd string (this appears right after reading numerical value)

The problem is that after entering the numerical value, the first input.nextLine() is skipped and the second input.nextLine() is executed, so that my output looks like this:

Enter numerical value
3   // This is my input
Enter 1st string    // The program is supposed to stop here and wait for my input, but is skipped
Enter 2nd string    // ...and this line is executed and waits for my input

I tested my application and it looks like the problem lies in using input.nextInt(). If I delete it, then both string1 = input.nextLine() and string2 = input.nextLine() are executed as I want them to be.

Lii
  • 9,906
  • 6
  • 53
  • 73
blekione
  • 8,666
  • 3
  • 15
  • 23
  • 8
    Or you could be like me and use BufferedReader :) I don't care if it's old school, it has always worked and always will work for me. Also, knowledge of BufferedReader has application elsewhere. I simply don't like Scanner. – Cruncher Aug 27 '13 at 19:36

21 Answers21

968

That's because the Scanner.nextInt method does not read the newline character in your input created by hitting "Enter," and so the call to Scanner.nextLine returns after reading that newline.

You will encounter the similar behaviour when you use Scanner.nextLine after Scanner.next() or any Scanner.nextFoo method (except nextLine itself).

Workaround:

  • Either put a Scanner.nextLine call after each Scanner.nextInt or Scanner.nextFoo to consume rest of that line including newline

    int option = input.nextInt();
    input.nextLine();  // Consume newline left-over
    String str1 = input.nextLine();
    
  • Or, even better, read the input through Scanner.nextLine and convert your input to the proper format you need. For example, you may convert to an integer using Integer.parseInt(String) method.

    int option = 0;
    try {
        option = Integer.parseInt(input.nextLine());
    } catch (NumberFormatException e) {
        e.printStackTrace();
    }
    String str1 = input.nextLine();
    
Rohit Jain
  • 195,192
  • 43
  • 369
  • 489
  • Couldn't I use only `option = Integer.parseInt(input.nextLine());}` instead of full `try{...}`? Is there any weakness of using only above? – blekione Oct 27 '12 at 17:52
  • 7
    @blekione. You have to use `try-catch`, because `Integer.parseInt` throws `NumberFormatException` when an invalid argument is passed to it. You will learn about exception later on. For E.G: - `Integer.parseInt("abc")`. You don't want "abc" to get converted to int right? – Rohit Jain Oct 27 '12 at 18:02
  • 3
    @blekione. So, in the above case, your code will halt at that point, and you won't be able to continue the execution. With Exception Handling, you can handle such kind of conditions. – Rohit Jain Oct 27 '12 at 18:02
  • 4
    To which extent is the latter better? AFAIK Scanner#nextInt() is way more lenient in finding correct ints, by allowing group commas and locale prefixes and suffixes. Integer#parseInt() allows digits and decimal point only plus an optional sign. – Mordechai Jan 11 '17 at 03:00
  • 6
    I personally prefer a [`Scanner#hasNextFoo`](http://stackoverflow.com/a/3059367/5394855) check beforehand instead of a try-catch, but that works too. – MercyBeaucou Jan 22 '17 at 01:13
  • Scanner scan = new Scanner(System.in); int i = scan.nextInt(); Double d = scan.nextDouble(); int option = 0; try { option = Integer.parseInt(scan.nextLine()); } catch (NumberFormatException e) { //e.printStackTrace(); } String str = scan.nextLine(); System.out.println("String: " + str); System.out.println("Double: " + d); System.out.println("Int: " + i); – priya raj Jun 08 '17 at 06:57
  • 1
    Use ParseDouble has a new problem, that nextDouble use the regional configuration of decimal (. or ,) but Parsedouble always receive US decimal ( . ). – olmerg Oct 24 '17 at 21:58
  • 1
    Another solution could be to use a delimiter that will also ignore newlines besides just spaces. e.g. `Scanner input = new Scanner(System.in).useDelimiter("\\s+");` – Jorn Vernee Feb 19 '18 at 17:51
  • input.nextLine() not working for me. I am surprised because I have used it before. String s=input().nextLine() works. I don't know why it is demanding a String object. – Reeshabh Ranjan Aug 25 '18 at 04:33
  • A very important issue for new Java programmers and Excellent presentation about the issue. – Jency Oct 11 '19 at 17:40
  • If that is the case, Why don't we encounter the same problem if we use `Scanner.next()` call after `Scanner.nextInt()`. Why don't I get a blank string in `Scanner.next()` ? – Tushar Apr 15 '21 at 10:00
232

The problem is with the input.nextInt() method - it only reads the int value. So when you continue reading with input.nextLine() you receive the "\n" Enter key. So to skip this you have to add the input.nextLine(). Hope this should be clear now.

Try it like that:

System.out.print("Insert a number: ");
int number = input.nextInt();
input.nextLine(); // This line you have to add (It consumes the \n character)
System.out.print("Text1: ");
String text1 = input.nextLine();
System.out.print("Text2: ");
String text2 = input.nextLine();
Ebony Maw
  • 494
  • 7
  • 20
Prine
  • 11,074
  • 8
  • 37
  • 57
  • umm seems a solution, making the skipped line non-used `nextLine`, but I still need an explanation of this behaviour – Eng.Fouad Aug 14 '11 at 12:25
  • 2
    FYI: merged from http://stackoverflow.com/questions/7056749/scanner-issue-when-using-nextline-after-nextxxx – Shog9 Nov 13 '14 at 19:11
  • Question : asked Oct 27 '12 at 16:37. answered Aug 14 '11 at 12:24. How's this even possible? – Apoorv Patne Apr 21 '20 at 09:47
  • If that is the case, Why don't we encounter the same problem if we use `Scanner.next()` call after `Scanner.nextInt()`. Why don't I get a blank string in `Scanner.next()` ? – Tushar Apr 15 '21 at 10:02
85

It's because when you enter a number then press Enter, input.nextInt() consumes only the number, not the "end of line". When input.nextLine() executes, it consumes the "end of line" still in the buffer from the first input.

Instead, use input.nextLine() immediately after input.nextInt()

Bohemian
  • 365,064
  • 84
  • 522
  • 658
  • 8
    @Victor it's not bug. it's working as specified. you could argue though that there should be an easy way to tell the api to also consume any whitespace following the target input. – Bohemian May 29 '14 at 13:38
  • I see. thanks @Bohemian, that exactly what i am arguing. I think that this should be changed, perhaps you can point me where to suggest this "issue" in the next JCP. – Victor May 29 '14 at 14:55
  • @victor You can request (and find out how to contribute code to) a feature via the [Report a Bug or Request a Feature](http://bugreport.java.com/) page. – Bohemian May 29 '14 at 15:18
  • FYI: merged from http://stackoverflow.com/questions/7056749/scanner-issue-when-using-nextline-after-nextxxx – Shog9 Nov 13 '14 at 19:12
  • If that is the case, Why don't we encounter the same problem if we use `Scanner.next()` call after `Scanner.nextInt()`. Why don't I get a blank string in `Scanner.next()` ? – Tushar Apr 15 '21 at 10:02
50

There seem to be many questions about this issue with java.util.Scanner. I think a more readable/idiomatic solution would be to call scanner.skip("[\r\n]+") to drop any newline characters after calling nextInt().

EDIT: as @PatrickParker noted below, this will cause an infinite loop if user inputs any whitespace after the number. See their answer for a better pattern to use with skip: https://stackoverflow.com/a/42471816/143585

Community
  • 1
  • 1
Denis Tulskiy
  • 18,506
  • 6
  • 47
  • 63
  • FYI: merged from http://stackoverflow.com/questions/7056749/scanner-issue-when-using-nextline-after-nextxxx – Shog9 Nov 13 '14 at 19:12
  • I know what we do to remove the data in buffer, but this case, please help me with this: http://stackoverflow.com/questions/33585314/having-issues-with-scanner – appiconhero.co Nov 07 '15 at 18:03
  • 1
    FYI, this will cause an infinite loop is the user types any tabs or spaces after the numeric input. See my answer here for a better skip: http://stackoverflow.com/a/42471816/7098259 – Patrick Parker Feb 26 '17 at 17:52
  • @PatrickParker: it does indeed cause an infinite loop! Thanks, edited the answer to link to yours. – Denis Tulskiy Feb 27 '17 at 05:57
35

It does that because input.nextInt(); doesn't capture the newline. you could do like the others proposed by adding an input.nextLine(); underneath.
Alternatively you can do it C# style and parse a nextLine to an integer like so:

int number = Integer.parseInt(input.nextLine()); 

Doing this works just as well, and it saves you a line of code.

Electric Coffee
  • 10,583
  • 7
  • 59
  • 124
  • FYI: merged from http://stackoverflow.com/questions/7056749/scanner-issue-when-using-nextline-after-nextxxx – Shog9 Nov 13 '14 at 19:12
  • 1
    you have to use try catch here. What will happen if the input is not a number. NumberFormatException need to be handled here. – Arundev Mar 25 '19 at 11:46
  • This assumes that there is only one int token on each line you try this for. – cellepo May 18 '19 at 20:42
  • If that is the case, Why don't we encounter the same problem if we use `Scanner.next()` call after `Scanner.nextInt()`. Why don't I get a blank string in `Scanner.next()` ? – Tushar Apr 15 '21 at 10:02
  • @Tushar I wish I remembered, I haven't touched Java since I wrote that answer in '13 – Electric Coffee Apr 15 '21 at 12:26
30

TL;DR
Use scanner.skip("\\R") (since skip uses regex where \R represents line separators) before each scanner.newLine() call, which is executed after:

  • scanner.next()
  • scanner.next*TYPE*() method, like scanner.nextInt().

OR safer variant: scanner.skip("\\R?")before each scanner.nextLine() if you are not sure if it will be called after scanner.next() or scanner.next*TypeName*() . ? will make line separator sequence optional (this will prevent skip method from (a) waiting for matching sequence - in case of still opened source of data like System.in (b) throwing java.util.NoSuchElementException in case of terminated/ended source of data like File or String)

Things you need to know:

  • text which represents few lines also contains non-printable characters between lines (we call them line separators) like

  • carriage return (CR - in String literals represented as "\r")

  • line feed (LF - in String literals represented as "\n")

  • when you are reading data from the console, it allows the user to type his response and when he is done he needs to somehow confirm that fact. To do so, the user is required to press "enter"/"return" key on the keyboard.

What is important is that this key beside ensuring placing user data to standard input (represented by System.in which is read by Scanner) also sends OS dependant line separators (like for Windows \r\n) after it.

So when you are asking the user for value like age, and user types 42 and presses enter, standard input will contain "42\r\n".

Problem

Scanner#nextInt (and other Scanner#nextType methods) doesn't allow Scanner to consume these line separators. It will read them from System.in (how else Scanner would know that there are no more digits from the user which represent age value than facing whitespace?) which will remove them from standard input, but it will also cache those line separators internally. What we need to remember, is that all of the Scanner methods are always scanning starting from the cached text.

Now Scanner#nextLine() simply collects and returns all characters until it finds line separators (or end of stream). But since line separators after reading the number from the console are found immediately in Scanner's cache, it returns empty String, meaning that Scanner was not able to find any character before those line separators (or end of stream).
BTW nextLine also consumes those line separators.

Solution

So when you want to ask for number and then for entire line while avoiding that empty string as result of nextLine, either

  • consume line separator left by nextInt from Scanners cache by
  • calling nextLine,
  • or IMO more readable way would be by calling skip("\\R") or skip("\r\n|\r|\n") to let Scanner skip part matched by line separator (more info about \R: https://stackoverflow.com/a/31060125)
  • don't use nextInt (nor next, or any nextTYPE methods) at all. Instead read entire data line-by-line using nextLine and parse numbers from each line (assuming one line contains only one number) to proper type like int via Integer.parseInt.

BTW: Scanner#nextType methods can skip delimiters (by default all whitespaces like tabs, line separators) including those cached by scanner, until they will find next non-delimiter value (token). Thanks to that for input like "42\r\n\r\n321\r\n\r\n\r\nfoobar" code

int num1 = sc.nextInt();
int num2 = sc.nextInt();
String name = sc.next();

will be able to properly assign num1=42 num2=321 name=foobar.

Pshemo
  • 113,402
  • 22
  • 170
  • 242
17

Instead of input.nextLine() use input.next(), that should solve the problem.

Modified code:

public static Scanner input = new Scanner(System.in);

public static void main(String[] args)
{
    System.out.print("Insert a number: ");
    int number = input.nextInt();
    System.out.print("Text1: ");
    String text1 = input.next();
    System.out.print("Text2: ");
    String text2 = input.next();
}
arghtype
  • 3,966
  • 11
  • 39
  • 54
Castaldi
  • 631
  • 7
  • 20
  • FYI: merged from http://stackoverflow.com/questions/7056749/scanner-issue-when-using-nextline-after-nextxxx – Shog9 Nov 13 '14 at 19:12
16

If you want to read both strings and ints, a solution is to use two Scanners:

Scanner stringScanner = new Scanner(System.in);
Scanner intScanner = new Scanner(System.in);

intScanner.nextInt();
String s = stringScanner.nextLine(); // unaffected by previous nextInt()
System.out.println(s);

intScanner.close();
stringScanner.close();
  • 1
    This is what I was looking for, for some time now. Smart move! – Liam Wilson Apr 30 '19 at 01:47
  • please do not do this. Just one scanner per inputstream. Also, when you do `intScanner.close();` you close stringScanner + the whole `System.in` for the rest of your execution. – aran Feb 23 '21 at 13:39
13

If you want to scan input fast without getting confused into Scanner class nextLine() method , Use Custom Input Scanner for it .

Code :

class ScanReader {
/**
* @author Nikunj Khokhar
*/
    private byte[] buf = new byte[4 * 1024];
    private int index;
    private BufferedInputStream in;
    private int total;

    public ScanReader(InputStream inputStream) {
        in = new BufferedInputStream(inputStream);
    }

    private int scan() throws IOException {
        if (index >= total) {
            index = 0;
            total = in.read(buf);
            if (total <= 0) return -1;
        }
        return buf[index++];
    }
    public char scanChar(){
        int c=scan();
        while (isWhiteSpace(c))c=scan();
        return (char)c;
    }


    public int scanInt() throws IOException {
        int integer = 0;
        int n = scan();
        while (isWhiteSpace(n)) n = scan();
        int neg = 1;
        if (n == '-') {
            neg = -1;
            n = scan();
        }
        while (!isWhiteSpace(n)) {
            if (n >= '0' && n <= '9') {
                integer *= 10;
                integer += n - '0';
                n = scan();
            }
        }
        return neg * integer;
    }

    public String scanString() throws IOException {
        int c = scan();
        while (isWhiteSpace(c)) c = scan();
        StringBuilder res = new StringBuilder();
        do {
            res.appendCodePoint(c);
            c = scan();
        } while (!isWhiteSpace(c));
        return res.toString();
    }

    private boolean isWhiteSpace(int n) {
        if (n == ' ' || n == '\n' || n == '\r' || n == '\t' || n == -1) return true;
        else return false;
    }

    public long scanLong() throws IOException {
        long integer = 0;
        int n = scan();
        while (isWhiteSpace(n)) n = scan();
        int neg = 1;
        if (n == '-') {
            neg = -1;
            n = scan();
        }
        while (!isWhiteSpace(n)) {
            if (n >= '0' && n <= '9') {
                integer *= 10;
                integer += n - '0';
                n = scan();
            }
        }
        return neg * integer;
    }

    public void scanLong(long[] A) throws IOException {
        for (int i = 0; i < A.length; i++) A[i] = scanLong();
    }

    public void scanInt(int[] A) throws IOException {
        for (int i = 0; i < A.length; i++) A[i] = scanInt();
    }

    public double scanDouble() throws IOException {
        int c = scan();
        while (isWhiteSpace(c)) c = scan();
        int sgn = 1;
        if (c == '-') {
            sgn = -1;
            c = scan();
        }
        double res = 0;
        while (!isWhiteSpace(c) && c != '.') {
            if (c == 'e' || c == 'E') {
                return res * Math.pow(10, scanInt());
            }
            res *= 10;
            res += c - '0';
            c = scan();
        }
        if (c == '.') {
            c = scan();
            double m = 1;
            while (!isWhiteSpace(c)) {
                if (c == 'e' || c == 'E') {
                    return res * Math.pow(10, scanInt());
                }
                m /= 10;
                res += (c - '0') * m;
                c = scan();
            }
        }
        return res * sgn;
    }

}

Advantages :

  • Scans Input faster than BufferReader
  • Reduces Time Complexity
  • Flushes Buffer for every next input

Methods :

  • scanChar() - scan single character
  • scanInt() - scan Integer value
  • scanLong() - scan Long value
  • scanString() - scan String value
  • scanDouble() - scan Double value
  • scanInt(int[] array) - scans complete Array(Integer)
  • scanLong(long[] array) - scans complete Array(Long)

Usage :

  1. Copy the Given Code below your java code.
  2. Initialise Object for Given Class

ScanReader sc = new ScanReader(System.in); 3. Import necessary Classes :

import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; 4. Throw IOException from your main method to handle Exception 5. Use Provided Methods. 6. Enjoy

Example :

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
class Main{
    public static void main(String... as) throws IOException{
        ScanReader sc = new ScanReader(System.in);
        int a=sc.scanInt();
        System.out.println(a);
    }
}
class ScanReader....
NIKUNJ KHOKHAR
  • 711
  • 6
  • 17
12

In order to avoid the issue, use nextLine(); immediately after nextInt(); as it helps in clearing out the buffer. When you press ENTER the nextInt(); does not capture the new line and hence, skips the Scanner code later.

Scanner scanner =  new Scanner(System.in);
int option = scanner.nextInt();
scanner.nextLine(); //clearing the buffer
Urvashi Gupta
  • 415
  • 4
  • 12
10

sc.nextLine() is better as compared to parsing the input. Because performance wise it will be good.

Aurasphere
  • 3,490
  • 12
  • 37
  • 63
shankar upadhyay
  • 646
  • 8
  • 14
6

I guess I'm pretty late to the party..

As previously stated, calling input.nextLine() after getting your int value will solve your problem. The reason why your code didn't work was because there was nothing else to store from your input (where you inputted the int) into string1. I'll just shed a little more light to the entire topic.

Consider nextLine() as the odd one out among the nextFoo() methods in the Scanner class. Let's take a quick example.. Let's say we have two lines of code like the ones below:

int firstNumber = input.nextInt();
int secondNumber = input.nextInt();

If we input the value below (as a single line of input)

54 234

The value of our firstNumber and secondNumber variable become 54 and 234 respectively. The reason why this works this way is because a new line feed (i.e \n) IS NOT automatically generated when the nextInt() method takes in the values. It simply takes the "next int" and moves on. This is the same for the rest of the nextFoo() methods except nextLine().

nextLine() generates a new line feed immediately after taking a value; this is what @RohitJain means by saying the new line feed is "consumed".

Lastly, the next() method simply takes the nearest String without generating a new line; this makes this the preferential method for taking separate Strings within the same single line.

I hope this helps.. Merry coding!

Taslim Oseni
  • 4,610
  • 10
  • 34
  • 50
5
public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int i = scan.nextInt();
        scan.nextLine();
        double d = scan.nextDouble();
        scan.nextLine();
        String s = scan.nextLine();

        System.out.println("String: " + s);
        System.out.println("Double: " + d);
        System.out.println("Int: " + i);
    }
Neeraj Gahlawat
  • 983
  • 11
  • 9
  • If you use the nextLine() method immediately following the nextInt() method, recall that nextInt() reads integer tokens; because of this, the last newline character for that line of integer input is still queued in the input buffer and the next nextLine() will be reading the remainder of the integer line (which is empty). – Neeraj Gahlawat Jul 30 '17 at 03:50
5

if I expect a non-empty input

avoids:
–  loss of data if the following input is eaten by an unchecked scan.nextLine() as workaround
–  loss of data due to only partially read lines because scan.nextLine() was replaced by scan.next() (enter: "yippie ya yeah")
–  Exceptions that are thrown when parsing input with Scanner methods (read first, parse afterwards)

public static Function<Scanner,String> scanLine = (scan -> {
    String s = scan.nextLine();
    return( s.length() == 0 ? scan.nextLine() : s );
  });


used in above example:

System.out.println("Enter numerical value");    
int option = input.nextInt(); // read numerical value from input

System.out.println("Enter 1st string"); 
String string1 = scanLine.apply( input ); // read 1st string
System.out.println("Enter 2nd string");
String string2 = scanLine.apply( input ); // read 2nd string
Kaplan
  • 872
  • 3
  • 7
  • 1
    never seen this before. How would this behave in (*beware spam*) the close scenario? https://stackoverflow.com/a/65515359/2148953 – aran Feb 27 '21 at 14:38
  • 1
    @aran While here the problem is, to prevent an empty input *(working in any scenario)*, is the other problem mentioned above, that the resources of an active `Scanner` are being released through of a wrong placed call of `close`. The use of [autoclosing](https://stackoverflow.com/questions/65503259/should-a-scanner-only-be-instantiated-only-once-if-thats-the-case-why-so/66401952#66401952) is the correct way to close the `Scanner` or any other `AutoCloseable`. – Kaplan Feb 28 '21 at 10:27
  • Very interesting indeed @Kaplan. Thanks! – aran Mar 01 '21 at 06:42
4

Use 2 scanner objects instead of one

Scanner input = new Scanner(System.in);
System.out.println("Enter numerical value");    
int option;
Scanner input2 = new Scanner(System.in);
option = input2.nextInt();
Harsh Shah
  • 117
  • 1
  • 3
4

As nextXXX() methods don't read newline, except nextLine(). We can skip the newline after reading any non-string value (int in this case) by using scanner.skip() as below:

Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
sc.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");
System.out.println(x);
double y = sc.nextDouble();
sc.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");
System.out.println(y);
char z = sc.next().charAt(0);
sc.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");
System.out.println(z);
String hello = sc.nextLine();
System.out.println(hello);
float tt = sc.nextFloat();
sc.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");
System.out.println(tt);
M. S.
  • 3,461
  • 10
  • 22
  • 33
Sandeep Kumar
  • 1,707
  • 4
  • 21
  • 31
4

In one of my usecase, I had the scenario of reading a string value preceded by a couple of integer values. I had to use a "for / while loop" to read the values. And none of the above suggestions worked in this case.

Using input.next() instead of input.nextLine() fixed the issue. Hope this might be helpful for those dealing with similar scenario.

Giri
  • 2,546
  • 2
  • 20
  • 27
  • Short answer is that whitespace matters. If you have multiple integers on the same line, you can still use nextLine and split them, and you still need a nextLine after the last next call on the line of input – OneCricketeer Oct 30 '20 at 15:58
2

Use this code it will fix your problem.

System.out.println("Enter numerical value");    
int option;
option = input.nextInt(); // Read numerical value from input
input.nextLine();
System.out.println("Enter 1st string"); 
String string1 = input.nextLine(); // Read 1st string (this is skipped)
System.out.println("Enter 2nd string");
String string2 = input.nextLine(); // Read 2nd string (this appears right after reading numerical value)
Jeewantha Lahiru
  • 302
  • 2
  • 13
0

Why not use a new Scanner for every reading? Like below. With this approach you will not confront your problem.

int i = new Scanner(System.in).nextInt();
Tobias Johansson
  • 368
  • 3
  • 11
0

The problem is with the input.nextInt() method - it only reads the int value. So when you continue reading with input.nextLine() you receive the "\n" Enter key. So to skip this you have to add the input.nextLine(). Hope this should be clear now.

Try it like that:

System.out.print("Insert a number: ");
int number = input.nextInt();
input.nextLine(); // This line you have to add (It consumes the \n character)
System.out.print("Text1: ");
String text1 = input.nextLine();
System.out.print("Text2: ");
String text2 = input.nextLine();
Pallav Khare
  • 299
  • 1
  • 5
  • 12
0

To resolve this problem just make a scan.nextLine(), where scan is an instance of the Scanner object. For example, I am using a simple HackerRank Problem for the explanation.

package com.company;
import java.util.Scanner;

public class hackerrank {
public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    int i = scan.nextInt();
    double d = scan.nextDouble();
    scan.nextLine(); // This line shall stop the skipping the nextLine() 
    String s = scan.nextLine();
    scan.close();



    // Write your code here.

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

}