Рубрики
Без рубрики

Чтение строки после целого числа

Прошло много времени с тех пор, как я начал изучать Java, и у меня наконец вошло в привычку завершать работу… С пометкой java, новички, учебное пособие.

Прошло много времени с тех пор, как я начал изучать Java, и у меня наконец-то вошло в привычку снова заканчивать свои строки. Изучение python действительно не помогло моей кривой обучения Java, но я все равно справился с этим. Процесс создания стал намного более плавным, и я, честно говоря, чувствую, что стал более эффективным программистом. Эти мысли вдохновили на создание предстоящей серии, и прежде чем я углублюсь в пост, позвольте мне объяснить, о чем эта новая серия.

В основном я расскажу обо всех своих самых больших подводных камнях и препятствиях, с которыми я столкнулся во время изучения языка, и просто о темах в целом, которые, по моему мнению, были освещены не так хорошо, как мне бы хотелось. Как бы то ни было, давайте сразу погрузимся в суть.

Чтение в строке после целого числа

Ради обучения я начну с самого начала. Я не собираюсь полностью возвращаться к переменным, просто возвращаюсь к тому моменту, когда мы узнали о получении входных данных с терминала. И это с помощью класса Scanner. Прежде чем мы сможем даже использовать объекты сканера, нам нужно импортировать их, вот так.

import java.util.Scanner;

Это позволяет нам создавать (создавать) столько объектов сканера, сколько нам нравится. Обычно вам нужен только один. Когда мы создаем новый объект сканера, мы передаем System.in в качестве параметра для его конструктора. Как только мы создали объект Scanner, мы можем использовать метод Scanner, nextLine() , чтобы запросить у пользователя ввод в терминале.

Scanner input = new Scanner(System.in); // creating new Scanner Object

System.out.print("Please enter your name: "); //prompting the user for a value

String name = input.nextLine(); 

System.out.println("Hello " + name);

Вы можете заметить, что я использую System.out. print() метод вместо обычного println() . Это связано с тем, что print() не добавляет символ новой строки в конец строки, и это позволяет нам получать входные данные в той же строке, в которой мы печатаем. Это всего лишь стандартное соглашение при вводе входных данных в терминал.

Класс сканера позволяет получать входные данные с терминала. При получении входных данных на большинстве языков типом данных по умолчанию, вводимых с терминала, является строка, и если вы хотите целое число или значение с плавающей запятой, вам придется затем привести или преобразовать входные данные в интересующий тип данных. В Java класс Scanner позволяет нам считывать входные данные как двойное целое число или число с плавающей запятой, используя методы nextInt() и nextDouble() . Итак, если бы мы продолжили с предыдущего фрагмента…

System.out.printf("Please enter your age: ");

int age = input.nextInt();
if (16 < age && age < 21) {

    System.out.println("Consider yourself part of the most elite generation that has set foot on Earth");

} else {

    System.out.println("Sorry you didn't make the cut :(");

}

Проблема 💢

Если вам интересно: “что было настолько ошеломляющим, что я должен был упомянуть об этом в этой серии?”. Что ж, позвольте мне объяснить…

Бывают случаи, когда вам захочется прочитать строку после чтения в виде целого числа, двойного числа или числа с плавающей запятой и т.д. Если вы это сделаете, вы можете увидеть, как происходит что-то странное. Например.

Scanner in = new Scanner(System.in);

System.out.print("How old are you? :")
int age = input.nextInt(); // Let say I enter 26 at runtime

System.out.print("What is your name? :)
int name = input.nextString(); // I will not be allowed to enter input here

System.out.printf("%s is %d years old", name, age); // The output will be (" is 26 years old")

Когда этот код выполняется, Java не дает мне возможности ввести что-либо для переменной name. Он как бы просто пропускает эту строку и выполняет последнюю строку кода. Значением переменной name будет пустая строка. Вы можете поверить мне на слово или, если вы все еще настроены скептически, скопируйте приведенный выше фрагмент и запустите код самостоятельно. Самый быстрый способ сделать это – использовать reply.it . Теперь, когда вы мне верите, позвольте мне объяснить, что происходит.

Когда вызывается метод input.nextLine() , объект сканера будет ждать, пока вы, пользователь, нажмете enter. Это сообщит объекту сканера, что вы закончили вводить текст, и прекратит прием ввода. Вы также должны знать, что клавиша enter – это символ. Я буду ссылаться на этот символ как на возвращаемый символ. Возвращаемый символ представлен символом \n в строках java. Другими словами, когда java считывает строку и натыкается на возвращаемый символ, java не вставляет символы “\ n” в текст, вместо этого она использует его для форматирования текста, перемещая то, что осталось от строки, на следующую строку.

Что я пытаюсь донести, так это то, что возвращаемый символ будет последним символом в строке ввода. Следовательно, сканер будет рассматривать все, что находится перед возвращаемым символом, как фактический ввод.

Метод nextLine() может легко преобразовать входные данные в строку, поскольку это тот тип данных, в который они были введены. Он просто прочитает все символы и удалит последний символ. Мне нравится думать об этом процессе как об очистке символа ввода.

Метод Scanner nextInt() не выполняет ту же очистку. Когда вы вводите значение и нажимаете enter. В конце этого ввода остается символ новой строки. Он просто как бы зависает в терминале по причинам, в которых я все еще не уверен, до тех пор, пока от пользователя не потребуется больше ввода. Это означает, что в следующий раз, когда вы вызовете nextLine() . Он рассматривает предыдущий символ новой строки как сигнал о том, что вы уже ввели свои входные данные, оставляя вас с пустой строкой. Теперь вы должны иметь представление о том, что происходит на следующей картинке.

Решение проблемы 💡

Есть разные способы обойти это. Один из способов – просто прочитать все ваши строки перед вашими целыми числами, числами с плавающей запятой и т.д. По моему мнению, это не квалифицируется как “решение” в моей книге. Лучшее решение – просто вызвать nextLine() дважды. Один раз, чтобы удалить символ новой строки, который висит в терминале, и второй раз, чтобы мы могли прочитать значение в обычном режиме.

System.out.print("How old are you?: ");
int age = input.nextLine();

System.out.print("What is your name?: ");

input.nextLine(); // this will remove the hanging return character
String name = input.nextLine();

У всех проблем, с которыми я сталкивался, всегда был какой-нибудь хитрый трюк или решение. Я пришел к выводу, что Java – один из самых уважаемых языков в техническом сообществе. Я начинаю задаваться вопросом, происходит ли это потому, что люди часто используют его и находят полезным, или из-за этих проблем с нишей, которые так трудно преодолеть. В любом случае, мне понравилось изучать язык, и я надеюсь, что это поможет бедной душе, которая была задушена этой тривиальной проблемой.

Как всегда, спасибо за прочитанное и счастливого кодирования 💻 !

Оригинал: “https://dev.to/sbu_05/reading-an-string-after-an-integer-4jbp”