【问题标题】:I have two questions related to getchar() and putchar() [duplicate]我有两个与 getchar() 和 putchar() 相关的问题 [重复]
【发布时间】:2013-10-19 16:31:51
【问题描述】:
#include<stdio.h>

main()
{
char c;
c=getchar();
putchar(c);

c=getchar();
putchar(c);

c=getchar(); 
putchar(c);

c=getchar();
putchar(c);

c=getchar();
putchar(c);

}

我的第一个问题是,每当我们使用 getchar() 时,它都会在内存中的某处创建一个缓冲区,当我们按下回车键时 getchar() 开始从缓冲区读取内容并 getchar() 一次只能读取一个字符。因此,在上面的程序中,当第一个 getchar() 执行时,它会在内存中创建一个缓冲区,并且整行内容将存储在缓冲区中,假设我在输入 getchar() 时写了“vik” 开始从缓冲区读取内容,然后 'v' 将分配给变量 c,然后只有 'v' 将从缓冲区中刷新,因为 getchar() 一次只读取单个字符。然后在下一个语句中 putchar(c) 在屏幕上打印“v”。所以现在“ik”在第二个 getchar() 语句执行时留在缓冲区中,它不会再次要求用户写东西,因为除非和直到缓冲区不会完全刷新它不会再次要求用户写一些东西,而不是从缓冲区中读取的内容。所以这里“ik”保留在黄油中,所以在第二个 getchar() 语句中从缓冲区中读取“i”,然后再次从缓冲区中刷新“i”并 putchar(c) 打印“我”。现在 'k' 在第 3 次 getchar() 执行时留在缓冲区中,从缓冲区中读取 'k' 并赋值给 c 然后 'k' 也从缓冲区中刷新。此时缓冲区已完全刷新,当第 4 个 getchar() 将执行其要求用户写入内容时,缓冲区中没有内容,因为缓冲区中没有内容,所以假设我写“as”并按 Enter。 现在我的主要问题是,当我给出两个内容“as”时,还有两个 getchar() 和 putchar(c) 需要执行,所以为什么只有 'a' 会打印在屏幕上,为什么不打印 's'还有?

而且, 我的第二个问题是,如果我们说当我们使用 getchar() 时,它会在内存中创建一个缓冲区 所以如果我们使用 fflush(stdin) 它必须刷新缓冲区。因此,根据上述程序中的这一点,当我在第一个 putchar(c) 之后写 fflush(stdin) 而不是刷新缓冲区时,它执行并打印与上述程序相同的输出,为什么?

【问题讨论】:

  • fflush(stdin) 是未定义的行为。
  • 你应该添加完整的标点符号! (大喊

标签: c getchar putchar


【解决方案1】:

。此时缓冲区已完全刷新,当第 4 个 getchar() 将执行其要求用户写入内容时,缓冲区中没有内容,因为缓冲区中没有内容所以假设我写“as”并点击进入。现在我的主要问题是,当我给出两个内容“as”时,还有两个 getchar() 和 putchar(c) 需要执行,那么为什么只有 'a' 会在屏幕上打印,为什么不是 's' 呢?

没有。缓冲区中有\n。这就是为什么您在输入as 时只会得到a

而且,我的第二个问题是,如果我们说当我们使用 getchar() 时它会在内存中创建一个缓冲区,那么如果我们使用 fflush(stdin) 它必须刷新缓冲区。因此,根据上述程序中的这一点,当我在第一个 putchar(c) 之后写入 fflush(stdin) 而不是刷新缓冲区时,它执行并打印与上述程序相同的输出,为什么?

fflush(stdin) 将调用未定义的行为(按照 ANSI C 标准)。你会得到任何东西。你很不幸它打印了相同的输出。

【讨论】:

  • 不一定是 MS-DOS,Linux 也支持:linux.die.net/man/3/fflush
  • 描述部分:对于输入流,fflush() 丢弃任何已从底层文件获取但尚未被应用程序使用的缓冲数据。
  • @YuHao;有趣的!从来不知道。
【解决方案2】:
  1. 因为vik 之后的新行仍在缓冲区中。所以第四个getchar()会处理新的一行。

  2. fflush(stdin) 不是标准 C,因此行为未定义,但某些编译器支持它作为扩展。

请注意,您应该声明int c,否则您将无法正确处理EOF。你也应该检查EOFgetchar()的原型是:

int getchar(void);

【讨论】:

    猜你喜欢
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多