我想编写一个代码来逐字符地反转一行中的每个单词,如下所示:
Input = Life is good
Output = efiL si doog
我能够通过使用2个扫描仪来实现这一点(这非常有效):
Scanner scan = new Scanner(text); //this was used in the code before, so i am emptying the memory
String result = "";
scan.nextLine();
String text = scan.nextLine();
Scanner scan2 = new Scanner(text);
while(scan2.hasNext())
{
String text2 = scan2.next();
result = result + " " + reverse(text2);
}
System.out.println("Reverse version : " + result);
但是当我试图通过一台扫描仪实现这一目标时,发生了一些令人分心的事情:
Scanner scan2 = new Scanner(System.in);
String result = "";
scan2.nextLine();
String text = scan2.nextLine();
while(scan2.hasNext())
{
text = scan2.next();
result = result + " " + reverse(text);
}
System.out.println("Reverse version : " + result);
实际上,主要问题是:将此代码更改为scan2.hasNext()
或!scan2.hasNext()
根本不会输出任何可见结果。 'while'仍在两种情况下都会启动并进入无限循环。在循环之前没有对文本进行任何输入也会启动它。我知道我可以通过Ctrl + D退出,但你可以看到我不想这样做。
第二个代码可能有错误,因为它经常改变,但主要问题仍然存在。
一个初学者在这里,所以每一个解释都会有所帮助。 先感谢您!
答案 0 :(得分:2)
您正在阅读System.in
。 System.in
是用户输入文本的位置,只有按Enter键才能读取文本。
扫描仪无法知道您是否继续输入文字。所以只有当它知道有下一个令牌(因为你输入了某个东西并按下Enter键),或者当它知道没有下一个令牌时(因为你通过键入Ctrl-D关闭了流),它才能返回)。所以,如果你没有输入任何东西,它会阻塞,等待你的输入。
目前还不清楚你想要达到的目标。扫描程序停止阻止的唯一方法是按Ctrl-D关闭流,或者输入特定的单词,检查代码中的单词,如果输入了单词,则跳出循环。
我也不明白你为什么要读两行并在进入循环之前忽略它们。
答案 1 :(得分:-2)
import java.util.Scanner;
public class Reverse {
public static void main (String[] args) {
Scanner scan = new Scanner(System.in);
String result;
String text;
while (true) {
text = scan.nextLine();
result = new StringBuffer(text).reverse().toString();
System.out.println("Reverse version : " + result);
}
}
}