此代码需要多个f
并仅打印1.有人可以向我解释为什么此代码不会打印两个f
s? putchar
出现两次,而不是EOF
。我已经盯着它看了好几个小时,我不明白它是如何只打印1 f
代码运行正常。我只是不明白它是如何逐步运作的。
/* A program that takes input of varied 'f's and out puts 1 f */
#include <stdio.h>
main()
{
int c;
while ((c = getchar()) != EOF)
{
if (c == 'f')
{
putchar(c);
}
while (c == 'f')
{
c = getchar();
}
if (c != EOF) putchar(c);
}
}
由于
答案 0 :(得分:0)
我会在代码中单步执行注释;对于f
(或实际上f\n
)作为输入:
#include <stdio.h>
main()
{
int c;
while ((c = getchar()) != EOF) // You type f and hit return key (remember this)
{
if (c == 'f') // c contains 'f' is true
{
putchar(c); // print 'f'
}
while (c == 'f') // c == 'f' is true
{
c = getchar(); // '\n' is buffered on stdin from return key
// so getchar() returns '\n'. So c will be set to '\n'
// It goes back to the while loop and checks if c == 'f'
// but it's not, it's '\n'! So this will run once only.
}
if (c != EOF) putchar(c); // '\n' != EOF, so print '\n' newline, back to loop
}
}
因此,将f\n
作为输入将产生输出f\n
如果是输入fffff
(实际上是fffff\n
),请参阅以下内容:
#include <stdio.h>
main()
{
int c;
while ((c = getchar()) != EOF) // You type fffff and hit return key
{
if (c == 'f') // c contains 'f' is true, first 'f'
{
putchar(c); // print 'f'
}
while (c == 'f') // First loop, c == 'f'
// Second loop, c == 'f'
// Last loop, c == '\n', so false
{
c = getchar(); // First loop: 'ffff\n' is still buffered on stdin
// c = 'f', loop again
// Last loop: c = '\n'
}
if (c != EOF) putchar(c); // '\n' != EOF, so print '\n' newline, back to loop
}
}
您看到内部while
循环会占用所有f
,直到您点击\n
,因此影响与上述相同。
答案 1 :(得分:-1)
if(c == 'f')
putchar(c);
这会打印一个f
,即您看到的那个。
while(c == 'f')
getchar(c);
这是f
消失的地方。如果您之前使用过putchar(c)
,则表示该循环至少会执行一次,因为 c == f
。所以f
已经消失(c != f
)
最后,您只需在第一个不是putchar(c)
的字符上使用f
。