为什么需要给整数变量的 getchar() 值才能让 putchar() 打印所有字符?

Why is it needed to give getchar() value of an integer variable in order to have putchar() print all characters?

我正在从《The C Programming Language》这本书中学习 C; 我的问题是关于我在尝试用几行有关输入和输出的代码重新表述时观察到的事情: 为什么需要给 getchar() 函数一个特定整数的值,以便它存储输入中的所有文本? 例如,这段代码 putchar() 正在打印我输入的所有内容;

int c;

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

但是,为什么我写的不一样:

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

在后一种情况下,例如,如果我写“okok”,程序就会打印“kk”。

我认为原因是在 getchar() 的某些 属性 中,我无法获得; 例如,如果我写了一个字符计数程序,我想排除新行,我还观察到如果我把它写成:

int nc, c;

nc = 0;
while ((c = getchar()) != EOF)
    if (c != '\n')
        ++nc;
printf("%d", nc);

但是当直接使用 getchar() 而不是 c 整数时,它无法正确区分 '\n':

while ((c = gethar()) != EOF)
    if (getchar() != '\n')
        ++nc;
printf("%d", nc);

我的目的只是为了理解,因为我不想仅仅靠记忆来学习这个,并且在书中写到getchar()是使用int值工作的,所以我想知道是否有什么东西尽管阅读了几次,但我还是错过了 getchar() 的属性,还在堆栈溢出中搜索了有关 getchar() 主题的不同问题。

写的时候

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

总是

  1. 读取一个字符并检查它是否有 EOF,
  2. 读取一个(另一个)字符并打印它,
  3. 重复。

因此,在您的“okok”示例中,与 EOF 相比,奇数 'o' 字符被读取并被丢弃,只有偶数 'k' 能够通过。

如果您想打印所有输入的字符,则必须重构代码。例如,要调用 getchar() 一次,将 return 值保存到变量中,然后使用已读取的值两次 - 检查 EOF 并打印它。

while (1) {  /* loop forever (until break is called) */
    int ch = getchar();
    if (ch == EOF)
        break;
    putchar(ch);
}

getchar() 函数从输入中获取一个字符 returns 它。

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

您已经使用了两次 getchar() 函数。

为输入'okok'

'o' 将在 while (getchar() != EOF) 中返回。 'k' 将在 putchar(getchar());

中返回

由于您在此处编写了 putchar(),它将获取字符 'k' 并打印出来。 该过程再次继续并仅打印 'k'。 所以输出将是 'kk'

要获取值 'okok' 并打印它,请尝试

do
{
    char c=getchar();
    if(c!=EOF)putchar(c);
}while(c!=EOF);