(练习1.6 K&R)如何验证getchar()!= EOF是0还是1?

问题描述 投票:10回答:7

我自己开始学习编程(C)作为一种爱好。我正在使用K&R。

 main()
{
int c;
while ((c = getchar()) != EOF)
putchar(c);
}

验证getchar()!= EOF是0还是1

我想我明白发生了什么:

  1. c从键盘分配下一个字符
  2. c检查是否是EOF
  3. c被指定为1或0,具体取决于它是否为EOF。
  4. 字符显示在输出上,或者如果EOF结束程序。

但是,我的解决方案是错误的,所以显然我不明白:

main ()
{
    int c;

    while ((c = getchar()) != EOF)
        printf("%d\n", c);
}

这只是打印字符的值。如果按回车键,也会打印“10”。

我以为它会打印c。但是,它是打印字符的值而不是1或0值。

我知道在将其与EOF进行比较后,c被赋予1或0。但我不确定我可以使用什么逻辑来表明这一点。看来我需要以某种方式“退出”显示字符值,而是显示比较值。这是否意味着我需要离开while循环?如果是这样,我不知道如何(这只是猜测)。

我怎样才能简单地验证c = 1还是0?

而且,我怎么知道这个?我想,必须有一些基本的东西,我应该从中学习。

main ()
{
    int c;

    while ((c = getchar()) != EOF != 0 != 1)
        putchar(c);
}

我也这样做了,我认为这似乎有效。因为它不输出任何字符,但我不确定这是否是他们正在寻找的解决方案......

c eof getchar
7个回答
11
投票

我知道在将其与EOF进行比较后,c被赋予1或0

不,不是。看:

while ((c = getchar()) != EOF)

表达式为:(c = getchar()) != EOF,其中包含另一个表达式:(c = getchar()),它将键盘中的字符分配给cc不会等于0或1!这是表达的结果。试试这段代码:

int main()
{
   char value;
   int c;
   value = ((c = getchar()) != EOF);
   printf("%i\n", value);
   return 0;
}

此代码将打印表达式(c = getchar()) != EOF的值。实际上,您的代码可以这样写:

int main ()
{
    int c;
    char value = ((c = getchar()) != EOF);
    while (value)
    {
        printf("%d\n", c);
        value = ((c = getchar()) != EOF);
    }
    return 0;
}

表达式不再在while中,其结果分配给value。上面的代码和你的代码将产生完全相同的输出。


编辑:

`main ()
{
    int c;

    while ((c = getchar()) != EOF != 0 != 1)
        putchar(c);
}`

这不是解决方案!这是重写的代码:

`main ()
{
    int c;
    char value1;
    char value2;
    char value3;

    value1 = ((c = getchar()) != EOF);
    value2 = value1 != 0;
    value3 = value2 != 1;
    while (value3)
    {
        putchar(c);
        value1 = ((c = getchar()) != EOF);
        value2 = value1 != 0;
        value3 = value2 != 1;
    }
}`

那会发生什么?让我们说getchar将返回角色'A'。所以value1将等于1,因为'A'与EOF不同。 value2将等于1,因为value1(等于1)不等于0.value3将等于0,因为value2(等于1)与1不同:while(value3)现在是while(0),所以没有将打印字符。

重要的是要理解您可以为变量赋予比较表达式的结果(这意味着具有至少一个比较运算符的表达式),并且此类表达式的结果为0(对于false)或1(对于true) 。


关于OP评论的几句话:

嘿,谢谢。但K&R明确表示“这有将c设置为1或0的不良影响”。也许这就是为什么我很困惑。

如果c看起来像这样,while将被分配为0或1:

while (c = getchar() != EOF)

运营商!=的优先级高于运营商=。这意味着将首先评估getchar() != EOF,然后将其结果分配给c


6
投票

我意识到这个问题是陈旧的,但选定的答案正在回答的问题不是那个问题的问题。 (这是从书中提出的另一个问题)我在这里澄清一些事情并希望从谷歌搜索这个问题的其他人可以阅读我的答案,以便更好地理解来自C编程语言的问题1-6版。

陈述的问题验证了getchar()!= EOF是0还是1

这本书暗示了这一点

**c = (getchar() != EOF)**

相当于

**c = getchar() != EOF**

当测试getchar() != EOF

如果输入不是EOF,那么它应该是真的,因此在这个意义上返回True1

当然,如果输入是EOF,那么getchar() != EOF将返回False0

这就是为什么10将被分配到c

对于书中提到的“不良影响”,因为10都不是原始输入,这意味着要输出的原始字符丢失,这是不可取的。

对于练习,请使用:

#include <stdio.h>

main()
{
    int c;
    while ( c = getchar() != EOF ) {
        printf("%d\n", c);
    }
}

如果您的输入不是EOF,那么它将打印1

如果您的输入是EOF,则程序结束。

注意:要在Windows中键入EOF,请使用Ctrl + Z.

编辑:

K&R练习1.6的简单解决方案。

printf("%d", getchar() != EOF);

3
投票

'c'被赋予来自getchar的值,然后检查它是否是EOF。

如果没有分配EOF,则打印'c'的值;如果没有,就存在循环。

EOF的测试不会将任何值重新分配给'c',它只会成功或失败

IOW,删除你的第3步。


1
投票

这里c没有分配比较结果。它包含value read form File.

要检查比较结果,您需要如下

int result =((c = getchar())!= EOF)

然后使用结果检查它是0还是1。

printf("%d",result);

1
投票

这个问题我遇到了很多麻烦。

如果按回车键,也会打印“10”。

另外,第20页K&R声明'\ n'的ASCII值是10.所以也许你无意中返回了这个值?

每当我回到它,我忘记了回车钥匙是不是EOF。

就像用户Sayyora指出的那样,你需要一个关键的组合来表示EOF。

对于Linux,它是:

Ctrl + D.

另外,要杀死程序(至少在X-Term中),它是:

Ctrl + C.


0
投票

我在DevC ++ 4.9.9.2中使用C源文件。我是C语言编程的新手,我正在使用K / R 2nd Ed。作为我的向导。在回顾了上面的陈述之后,我发现以下几行为我提供了例1.6 / 1.7所需的输出。请随意纠正我的理解,但通过了解有关使用括号和在while循环内外打印的作者提示,可以获得1或0的结果。最后一个getchar()是Dev-C环境要求保持输入/输出屏幕打开以便查看打印的语句。

main()
{
      int c; 
      while (c=getchar() !=EOF)
            printf("%d",c);
      printf("%d",c);
      getchar();      

0
投票
// it will accept and print a single char, a word, a sentence...

while (c != EOF) {
  printf("\ngetchar()) != EOF) = %d -- ", ((c=getchar()) != EOF));
  putchar(c);
}

//the trick is to only call getchar() once per char and EOF value
//note: the last char is always char(10) which is invisible
© www.soinside.com 2019 - 2024. All rights reserved.