K&R 1-9 // 在循环中的循环中使用 getchar
K&R 1-9 // using getchar in a loop inside a loop
我有这个简单的程序:
main()
{
int c;
while ((c = getchar()) != EOF)
{
if (c == ' ')
{
while ((c = getchar()) == ' ');
putchar(' ');
if (c == EOF) break;
}
putchar(c);
}
}
据我了解,有两个循环。第一个循环的条件是 getchar
的输出与 EOF
不同(因此隐含地循环在 EOF
处中断);第二个循环的条件是 getchar
的输出不是 blank
,那么它将恰好输出一个 blank
,如果非空白字符是 [=12] =] 整个程序会中断。
是否有必要对 EOF
进行第二次检查?不会是"spotted"
第一个循环的条件?
为什么 blank
个字符会在第二个循环中变成 "consumed",但第一个非空白字符仍然存在以便第一个 getchar
被读取?
好的,
内层
if (c == EOF) break;
避免后续
putchar(c);
如果循环的那个循环完成,将执行其他操作。
例如
main()
{
int c;
while ((c = getchar()) != EOF)
{
if (c == ' ')
{
while ((c = getchar()) == ' ');
putchar(' ');
if (c == EOF) break; // <<- This ...
}
putchar(c); // <<- ... jumps past this.
}
}
我有这个简单的程序:
main()
{
int c;
while ((c = getchar()) != EOF)
{
if (c == ' ')
{
while ((c = getchar()) == ' ');
putchar(' ');
if (c == EOF) break;
}
putchar(c);
}
}
据我了解,有两个循环。第一个循环的条件是 getchar
的输出与 EOF
不同(因此隐含地循环在 EOF
处中断);第二个循环的条件是 getchar
的输出不是 blank
,那么它将恰好输出一个 blank
,如果非空白字符是 [=12] =] 整个程序会中断。
是否有必要对 EOF
进行第二次检查?不会是"spotted"
第一个循环的条件?
为什么 blank
个字符会在第二个循环中变成 "consumed",但第一个非空白字符仍然存在以便第一个 getchar
被读取?
好的,
内层
if (c == EOF) break;
避免后续
putchar(c);
如果循环的那个循环完成,将执行其他操作。
例如
main()
{
int c;
while ((c = getchar()) != EOF)
{
if (c == ' ')
{
while ((c = getchar()) == ' ');
putchar(' ');
if (c == EOF) break; // <<- This ...
}
putchar(c); // <<- ... jumps past this.
}
}