while((ch = getchar())!= EOF)或预先声明int ch = getchar()

时间:2018-10-16 03:25:03

标签: c

我正在阅读《 C Primer Plus》这本书,并且遇到了如下代码片段:

// echo_eof.c -- repeats input to end of file.
#include <stdio.h>
int main(void)
{
    int ch;

    while ((ch = getchar()) != EOF)
        putchar(ch);

    return 0;
}

其输出:

$ ./a.out
She walks in beauty, like the night
She walks in beauty, like the night
   Of cloudless, climes and starry skies...
   Of cloudless, climes and starry skies...
            Lord Byron
            Lord Byron
^D

尽管如此,我发现while ((ch = getchar()) != EOF)中的嵌套括号对眼睛没有吸引力。因此,我将其更改为:

// echo_eof.c -- repeats input to end of file.
#include <stdio.h>
int main(void)
{
    int ch = getchar();

    while (ch!= EOF)
        putchar(ch);

    return 0;
}

但是,它无限S

$ ./a.out
She walks in beauty, like the night
SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS.....

我的重构代码有什么问题?

1 个答案:

答案 0 :(得分:3)

在while循环之前,您只获得一次char。 char指针永远不会递增,因此永远不会到达EOF。

只是出于好奇,您是否一直在使用其他语言(例如Python)来轻松将方法分配给变量? 在C语言中有点棘手,您需要使用指针:

int (*ch)(); // Creates a function pointer
ch = getchar; //Then assign your getchar() function to it, without the brackets
while ((*ch)() != EOF) // Dereference and call your function