了解putchar循环

时间:2015-01-26 14:55:57

标签: c

此代码需要多个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);
    }   
}

由于

2 个答案:

答案 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