java 循环错误输出太多未终止循环

bkhjykvo  于 2023-05-12  发布在  Java
关注(0)|答案(2)|浏览(104)

我需要编写一个Java程序,它接收一行文本作为输入,然后反向输出这行文本。程序重复,当用户为文本行输入“完成”、“完成”或“d”时结束。
例如,如果输入为:

Hello there
Hey
done

输出应为:

ereht olleH
yeH
enod

以下是我的当前代码:

import java.util.Scanner;

public class LabProgram 
{
    public static void main(String[] args) {
        Scanner scnr = new Scanner(System.in);
        String userInput;
        int numCharacter;  
        int i;
  
        userInput = scnr.nextLine();
  
  
        while((!userInput.equals("Done")) && 
        (!userInput.equals("done")) && (!userInput.equals("d"))) 
        {
            numCharacter=userInput.length();
            for (i=numCharacter; i>0; --i) 
            {
                System.out.print(userInput.charAt(i-1));
            }
        }
  
        System.out.println();
    userInput = scnr.nextLine();      
    }
}

我得到这个错误:

Program generated too much output.
Output restricted to 50000 characters.

Check program for any unterminated loops generating output.
gzszwxb4

gzszwxb41#

我建议你读一些关于Java中的scanner类的文章。https://www.w3schools.com/java/java_user_input
有些事情需要考虑。
首先,你可能希望nextLine在循环中:)。目前你没有抓住新的用户输入。从那里开始
每次在终端中输入新字符串并希望输入时,都需要调用nextLine。这可以通过在用户按下回车键时检入while循环来完成。
祝你好运

lnlaulya

lnlaulya2#

简短的回答是,在你第一次阅读userInput之后,你并没有阅读更多的userInput。你需要这样做,否则你的程序将永远循环。

userInput = scnr.nextLine();

while ((!userInput.equals("Done"))
            && (!userInput.equals("done"))
            && (!userInput.equals("d"))) {
    numCharacter = userInput.length();
    for (i = numCharacter; i > 0; --i) {
        System.out.print(userInput.charAt(i - 1));
    }
    System.out.println();
    // You forgot
    userInput = scnr.nextLine(); // <-- read userInput
}

但是,我会 * 简化 * 代码。首先编写一个方法来测试String是否与done的定义匹配。比如

private static boolean isDone(String s) {
    return "Done".equals(s) || "done".equals(s) || "d".equals(s);
}

接下来,Java提供了StringBuilder来创建 * 可变的 * 字符序列(它有一个reverse()方法)。因此,main可以简单为

Scanner scnr = new Scanner(System.in);
String userInput = scnr.nextLine();

while (!isDone(userInput)) {
    StringBuilder sb = new StringBuilder(userInput).reverse();
    System.out.println(sb);
    userInput = scnr.nextLine(); // Still need this
}

最后,我们可以使用赋值的副作用来简化为您可能认为具有的形式

Scanner scnr = new Scanner(System.in);
String userInput;
while (!isDone(userInput = scnr.nextLine())) {
    StringBuilder sb = new StringBuilder(userInput).reverse();
    System.out.println(sb);
}

现在我们不需要复制userInput = scnr.nextLine()

相关问题