【问题标题】:Counting number of times a character is inputted--Do-While Loops Java计算输入字符的次数--Do-While Loops Java
【发布时间】:2014-06-05 21:34:13
【问题描述】:

我有点困惑为什么我需要在这篇文章中使用 do-while 循环。我要做的是计算用户输入字符的次数。当用户键入“.”时,计数应该停止。当我尝试在没有 do-while 的情况下运行程序时,x 的计数乘以 3。我在网上读到控制台输入是行缓冲的。我理解的方式是,一整行是由一个字符创建的,因此实际上还有更多字符?我的理解正确吗?如果可能的话,我能解释一下 do-while 循环吗?

public class readCharLengths {
public static void main(String args[]) 
    throws java.io.IOException {
        char typed, ignore;
        int x=0;  
        for ( ; ; ) {      //infinite loop to keep reading in values

            typed = (char) System.in.read();      //get typed character

            do {                                    //confused here
            ignore = (char) System.in.read();       //confused here
            } while (ignore != '\n');               //confused here

                    if (typed =='.') break;       //break loop when . is typed
            x++;                                  //increment x

        }

     System.out.println("The number of characters is: " + x);   //print x

}
}

【问题讨论】:

  • 你不需要 do/while 但你还需要显示你的真实代码...... x 未定义,这不会按原样工作。
  • 尝试在读取每个typed 和ignore 后立即输出,看看你到底忽略了什么。
  • mortsahl,我更新了代码。乔,我尝试在读取这两个变量后输出它们。 “typed”变量接收输入,但“ignore”变量是空白的......这让我想知道为什么我需要do-while!不幸的是,没有它我无法让它工作!

标签: java for-loop increment do-while


【解决方案1】:

这取决于用户如何向控制台输入输入的情况。如果他们一次插入一个字符,则每个字符都在单独的行中。或者如果他们输入一串字符,基本上就像一个句子,然后你计算字符数直到达到一个句点。

如果是每行一个字符,我建议:

    int x = 0;
    Scanner in = new Scanner(System.in);
    while (true) {
        String input = in.nextChar();
        if (input.equals('.') {
            break;
        } else {
            x++;
        }
    }

如果是字符串,我建议:

    int x = 0;
    Scanner in = new Scanner(System.in);

    String input = in.nextLine();

    for (int i=0; i<input.length(); i++) {
        if (input.charAt(i).equals('.') {
            break;
        } else {
            x++;
        }
    }

【讨论】:

  • 感谢布莱斯的快速回答。我假设我从控制台读取的方式不是常见的方式,所以'Scanner in = new Scanner(System.in);'更常用于读取字符/字符串?
  • Scanner 类通常用于读取用户输入,但是,我仍然建议学习底层概念。
  • 我想说的是(这是我唯一的做法,也是我在企业界看到的唯一做法)。此外,Scanner 对解析文本非常有帮助,因为 Scanner 也用于读取文件。
【解决方案2】:

为了回答什么是 do...while 循环,我将介绍一些非常基本的编程概念。如果我遇到这种情况,我并不是要居高临下:我只是不知道你的编程技能水平,所以我假设你对它很陌生。

首先,让我解释一下循环条件的概念。循环条件是在您的程序运行时对其进行评估的代码,它将出现在true 或false。因此,对于常规的while 循环,格式为:

while (loop condition) {
    run some code, maybe multiple times
}

当您的代码到达while 代码行时,它会评估条件并决定是否在循环的大括号内运行代码。

假设您的条件是“x 必须小于 5”。你可能有一个像这样的while 循环:

int x = 0;
while(x < 5) {
   System.out.println("A");
   x++;
}

这段代码将在 5 行上打印 A,因为 x = 0 第一次到达 while 语句时,并且由于 0 &lt; 5 的计算结果为 true,循环的代码将被执行。当到达循环结束时,它跳到循环条件并再次评估它。这次是x = 1,因为我们在 x 上加了 1。由于1 &lt; 5,循环再次发生。这总共发生了 5 次,然后当它评估循环条件时,你让它尝试5 &lt; 5,即false。它跳过循环代码并在此时继续程序。

do...while 循环基于相同的想法。不是在循环开始时检查循环条件,而是在结束时检查。所以……

int x = 0;
do {
  System.out.println("A");
} while(x < 0);

此代码将输出一次 A。即使不满足循环条件(因为 x 从 0 开始),当您使用 do...while 时,循环代码总是至少执行一次。在循环结束时,检查条件,因为0 &lt; 0 是false,所以循环不会重复。


那么,关于System.in.read() 的工作原理。你说得对,它会缓冲输入直到达到换行符。但你真的知道这意味着什么吗?

这是它的工作原理。您开始在控制台中输入内容。假设您键入 aabbcc,然后按 Enter。您的程序在调用System.in.read() 时会等待,直到用户输入被发送回程序。但是,当输入第一个 a 时,它不会继续运行!您的程序只有在您按下回车后才能继续运行(即发送换行符)。

缓冲输入的想法是,一旦您的程序再次开始运行,您键入的所有字母都会被存储并可用。因此,当您在输入aabbcc 后运行程序时,所有这些字母都可用(以及您按下的回车键的换行符)。

使用您的代码,这意味着您第一次调用System.in.read() 时,您会返回字符a,但仍有abbcc 和换行符等待。它进入循环并读取每个字符。所以它读取a,然后是b,然后是b,然后是c,然后是c,然后是换行符。此时循环条件为false,循环结束。

【讨论】:

    【解决方案3】:

    嗯,这有几件事。

    首先,这可能不符合您的要求,因为 do/while 循环将消耗第一个字符之后的每个字符,而不会增加计数器,直到它到达 LF。因此,假设您输入了至少一个字符然后按 Enter 键,那么在执行 do/while 循环的情况下,您的计数将始终为 1。但是,如果您的意图是允许用户一次只输入一个字符(后跟 Enter),那么请参阅第二项。

    其次,在您按下 Enter 之前,控制台输入默认为缓冲。因此,如果您退出 do/while 循环,输入一个字符并按 Enter,您实际上会在 Windows 上获得三个字符——您键入的字符,CR 和 LF。假设您使用单个字符进行测试,这将解释乘以 3。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-19
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 2020-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多