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

时间:2013-07-19 12:09:10

标签: c eof getchar

我刚刚开始自学编程(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结束程序。
  5. 然而,我的解决方案是错误的,所以显然我不明白:

    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);
    }
    

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

8 个答案:

答案 0 :(得分:11)

  

我知道在将其与EOF进行比较后,c被指定为1或0

不,不是。看:

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

表达式为:(c = getchar()) != EOF,其中包含另一个表达式:(c = getchar()),它从键盘分配给c字符。 c不等于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(表示假)或1(为了真实)。


关于OP评论的几句话:

  嘿,谢谢。但是K& R明确地说“这具有将c设置为1或0的不期望的效果”。也许这就是为什么我很困惑。

如果c如下所示,

while将被分配为0或1:

while (c = getchar() != EOF)

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

答案 1 :(得分:5)

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

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

这本书暗示了

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

相当于

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

测试getchar() != EOF

如果输入不是 EOF,那么它应该为true,因此在这个意义上返回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&amp; R的练习1.6的简单解决方案。

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

答案 2 :(得分:3)

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

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

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

IOW,删除你的第3步。

答案 3 :(得分:1)

此处c未分配给比较结果。它包含value read form File.

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

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

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

printf("%d",result);

答案 4 :(得分:1)

我遇到这个问题很麻烦。

  

还打印&#34; 10&#34;如果我按回车键。

此外,第20页K&amp; R指出&#39; \ n&#39;的ASCII值。那么也许你无意中回到了那个价值?

每当我回到它,我忘记了回车键 EOF。

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

对于Linux,它是:

  

Ctrl + D

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

  

Ctrl + C

答案 5 :(得分: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();      

答案 6 :(得分: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

答案 7 :(得分:0)

#include <stdio.h>
   
int main(){
    int c;
    printf("Verifying that the expression 'c = getchar() != EOF' is: %d \n", (getchar() != EOF));
   
    return 0;
}

好吧,当您向 'c' 输入值时,它是 != 所以它返回 '1',当您发送 EOF 命令时它返回 '0'。

我认为这是书中的练习,因为它在一开始就不应该更复杂。