12

我刚刚开始自己​​学习编程(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 值。

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

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

还有,我怎么知道这个?我想,我应该从中学到一些基本的东西。

main ()
{
    int c;

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

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

4

8 回答 8

13

我知道 c 在与 EOF 比较后被分配了 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: is now没有什么不同,所以不会打印任何字符。while(value3)while(0)

重要的是要理解,您可以将比较表达式的结果(即具有至少一个比较运算符的表达式)分配给变量,而这种表达式的结果是 0(表示假)或 1(表示真) .


关于OP的评论几句话:

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

cwhile如果看起来像这样,将被分配给 0 或 1 :

while (c = getchar() != EOF)

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

于 2013-07-19T12:17:34.833 回答
6

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

所述问题验证 getchar() != EOF IS 0 OR 1

书中暗示

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

相当于

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

getchar() != EOF测试时,

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

当然,如果 input EOF,那么getchar() != EOF将返回 aFalse或 a 0

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

对于书中提到的“不良影响”,由于既不是原始输入1也不0是原始输入,这意味着原本要输出的字符丢失了,这是不可取的。

对于练习,使用这个:

#include <stdio.h>

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

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

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

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

编辑:

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

printf("%d", getchar() != EOF);
于 2015-01-24T01:56:21.740 回答
3

'c' 从 getchar 分配值,然后检查它是否为 EOF。

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

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

IOW,删除您的第 3 步。

于 2013-07-19T12:13:21.347 回答
1

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

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

int 结果 = ((c = getchar()) != EOF)

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

printf("%d",result);
于 2013-07-19T12:20:54.953 回答
1

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

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

此外,第 20 页 K&R 指出 '\n' 的 ASCII 值为 10。所以也许您无意中返回了该值?

每次我回到它,我都忘记了回车键不是EOF。

就像用户 Sayyora 上面指出的那样,您需要一个组合键来发出 EOF 信号。

对于 Linux,它是:

Ctrl + D

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

Ctrl + C

于 2015-12-27T07:30:54.920 回答
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”。

在我看来,这是书中的练习,因为它在开始时不应该更复杂。

于 2021-03-16T12:16:53.107 回答
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
于 2018-02-27T21:36:33.210 回答
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();      
于 2016-09-09T06:27:23.687 回答