K&R 练习 1-9:第二个 while 循环条件解释
K&R Exercise 1-9: second while-loop condition explain
我正在寻找有关此练习的帮助,并在此处找到了它。
while((c=getchar()) != EOF) {
if(c==' ') {
while((c=getchar()) == ' ');
putchar(' ');
}
}
我想了解第二个 while 循环的情况。
为什么第二个 (c=getchar()) 不要求另一个输入并在第一个循环中继续读取 c?
或许你能给我解释一下,这些"problems"我一个人是怎么解决的,或者是逻辑问题,我只能通过实践来解决。
当这段代码遇到space时,它会吃掉后面所有的space,只打印一个space.
while((c=getchar()) != EOF) { // As long as we don't reach EOF, get next character
if(c==' ') { // If character is a space,
// then, keep getting characters, as long as they are spaces
while((c=getchar()) == ' '); // This empty-bodied loop will stop when current character is not a space
putchar(' '); // Output a space character
}
}
因此,如果输入包含十个(例如)连续(彼此相邻)spaces,它只会打印一个 space.
在 K&R Exercise 1-9 (C) 阅读更多内容。
need an explanation for the condition in the eating loop. the first loop lets me make an entry, so why does the second just reads c further instead of asking for a new entry?
外循环将读取一个字符,为了这个例子,我们假设它是一个 space。它会进入它的主体,也会进入if语句的主体。
现在,它将读取下一个字符(在内循环中),如果它是 space,代码基本上不会对该 space 字符执行任何操作,因为正文内循环的是空的。它会继续,询问下一个字符。它会一次又一次地做同样的事情,只要下一个连续的字符是 space.
当下一个字符不是space时,代码将输出一个space(代表所有新遇到的space)。
例如,假设用户输入了三个 space,这三个 space 在后台存储在标准输入 (STDIN) 缓冲区中:
----------
|''|''|''|
----------
第一次执行外循环:获取第一个字符并将其存储到c
,确保它不是EOF。我们代码的控制流进入外循环体。
if 语句确认 c
是一个 space,进入其主体。
此时,STDIN缓冲区是这样的:
----------
|''|''| |
----------
现在,我们到达了内部循环 while((c=getchar()) == ' ');
,它有一个 空主体 。
getchar()
方法将获取下一个字符,并将其存储在c
中。然后它将检查它是否是 space,这在我们的例子中是正确的。现在,我们进入内部循环的空体,我们马上退出,因为这里没有什么可做的。
此时,STDIN缓冲区是这样的:
----------
|''| | |
----------
再次执行内部循环,该方法获取缓冲区中等待的下一个字符,并将其存储在 c
中。然后它会检查 c
是否是 space,因为在这种情况下也是如此,我们将再次进入空循环,不做任何事情并退出它。
此时,STDIN缓冲区是这样的:
----------
| | | |
----------
这是空的。
再次执行内部循环,该方法请求缓冲区中等待的下一个字符,并将其存储在 c
中。但是,由于没有更多的字符可读,getchar()
方法 returns EOF
,因此在内部循环条件中检查 space 字符失败,并且我们代码的控制流转到代码的下一行,因为内循环的条件现在为假。
下一行是 putchar(' ');
,它输出一个 space,而不关心我们之前读取的 space 的数量,在本例中是三个。
最后,外循环再次执行,第二次,getchar()
再次请求读取下一个字符,我们将其 return 值存储在 c
. c
等于EOF,导致外层循环的条件为假,也就是说我们现在也退出外层循环。
我正在寻找有关此练习的帮助,并在此处找到了它。
while((c=getchar()) != EOF) {
if(c==' ') {
while((c=getchar()) == ' ');
putchar(' ');
}
}
我想了解第二个 while 循环的情况。 为什么第二个 (c=getchar()) 不要求另一个输入并在第一个循环中继续读取 c? 或许你能给我解释一下,这些"problems"我一个人是怎么解决的,或者是逻辑问题,我只能通过实践来解决。
当这段代码遇到space时,它会吃掉后面所有的space,只打印一个space.
while((c=getchar()) != EOF) { // As long as we don't reach EOF, get next character
if(c==' ') { // If character is a space,
// then, keep getting characters, as long as they are spaces
while((c=getchar()) == ' '); // This empty-bodied loop will stop when current character is not a space
putchar(' '); // Output a space character
}
}
因此,如果输入包含十个(例如)连续(彼此相邻)spaces,它只会打印一个 space.
在 K&R Exercise 1-9 (C) 阅读更多内容。
need an explanation for the condition in the eating loop. the first loop lets me make an entry, so why does the second just reads c further instead of asking for a new entry?
外循环将读取一个字符,为了这个例子,我们假设它是一个 space。它会进入它的主体,也会进入if语句的主体。
现在,它将读取下一个字符(在内循环中),如果它是 space,代码基本上不会对该 space 字符执行任何操作,因为正文内循环的是空的。它会继续,询问下一个字符。它会一次又一次地做同样的事情,只要下一个连续的字符是 space.
当下一个字符不是space时,代码将输出一个space(代表所有新遇到的space)。
例如,假设用户输入了三个 space,这三个 space 在后台存储在标准输入 (STDIN) 缓冲区中:
----------
|''|''|''|
----------
第一次执行外循环:获取第一个字符并将其存储到c
,确保它不是EOF。我们代码的控制流进入外循环体。
if 语句确认 c
是一个 space,进入其主体。
此时,STDIN缓冲区是这样的:
----------
|''|''| |
----------
现在,我们到达了内部循环 while((c=getchar()) == ' ');
,它有一个 空主体 。
getchar()
方法将获取下一个字符,并将其存储在c
中。然后它将检查它是否是 space,这在我们的例子中是正确的。现在,我们进入内部循环的空体,我们马上退出,因为这里没有什么可做的。
此时,STDIN缓冲区是这样的:
----------
|''| | |
----------
再次执行内部循环,该方法获取缓冲区中等待的下一个字符,并将其存储在 c
中。然后它会检查 c
是否是 space,因为在这种情况下也是如此,我们将再次进入空循环,不做任何事情并退出它。
此时,STDIN缓冲区是这样的:
----------
| | | |
----------
这是空的。
再次执行内部循环,该方法请求缓冲区中等待的下一个字符,并将其存储在 c
中。但是,由于没有更多的字符可读,getchar()
方法 returns EOF
,因此在内部循环条件中检查 space 字符失败,并且我们代码的控制流转到代码的下一行,因为内循环的条件现在为假。
下一行是 putchar(' ');
,它输出一个 space,而不关心我们之前读取的 space 的数量,在本例中是三个。
最后,外循环再次执行,第二次,getchar()
再次请求读取下一个字符,我们将其 return 值存储在 c
. c
等于EOF,导致外层循环的条件为假,也就是说我们现在也退出外层循环。