[英]Counting number of times a character is inputted--Do-While Loops Java
我对于为什么需要这段代码中的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
}
}
这取决于用户如何向控制台提供输入的环境。 如果它们一次插入一个字符,则每个字符都放在单独的行上。 或者,如果他们输入了一个字符串(基本上像一个句子),然后您要计算直到达到句点为止的字符数。
如果每行一个字符,我建议:
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++;
}
}
好吧,关于这件事有两件事。
首先,这可能无法满足您的要求,因为do / while循环将消耗第一个字符之后的每个字符,而不会递增计数器直到命中LF。 因此,假设您至少键入了一个字符然后按Enter,则在执行do / while循环的情况下,您的计数将始终为1。 但是,如果您打算让用户一次只能输入一个字符(其次是Enter),则请参阅第二项。
其次,控制台输入默认为缓冲,直到您按Enter键为止。 因此,如果您执行do / while循环,输入一个字符并按Enter键,您实际上将在Windows上获得三个字符-您键入的字符CR和LF。 假设您使用单个字符进行测试,这将说明乘以3。
为了回答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 < 5
,并且由于0 < 5
计算结果为true
,因此将执行循环的代码。 到达循环末尾时,它将跳至循环条件并再次评估。 这次, x = 1
因为我们在x上加了1。 由于1 < 5
,循环再次发生。 总共发生5次,然后在评估循环条件时,尝试5 < 5
,这是false
。 它跳过循环代码,并在此时继续执行程序。
do ... while循环基于相同的想法。 而不是在循环开始时检查循环条件,而是在结束时检查它。 所以...
int x = 0;
do {
System.out.println("A");
} while(x < 0);
此代码将输出一次A。 即使不满足循环条件(因为x从0开始),当您使用do ... while时,循环代码始终至少执行一次。 在循环结束时,将检查条件,并且由于0 < 0
为false
,因此循环不会重复。
因此,有关System.in.read()
工作方式。 您完全可以缓冲输入,直到达到换行符为止。 但是您实际上知道这意味着什么吗?
运作方式如下。 您开始在控制台中输入内容。 假设您键入aabbcc
,然后按Enter。 您的程序在调用System.in.read()
之前会一直等待,直到将用户输入发送回该程序为止。 但是,当键入第a
时,它不会继续运行! 按下Enter键(即,发送换行符)后,程序才能继续运行。
缓冲输入的想法是,一旦您的程序再次开始运行,您输入的所有字母都将被存储并可用。 因此,当您在输入aabbcc
之后运行程序时,所有这些字母都可用(以及您按下的Enter键的换行符)。
对于您的代码,这意味着您第一次调用System.in.read()
,将获得字符a
,但是仍然有abbcc
和换行符在等待。 它进入循环并读取每个字符。 因此,它将读取a
,然后b
,然后b
,然后c
,然后c
,然后换行。 此时,循环条件为false
,循环结束。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.