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

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

4

2 回答 2

5

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

\n,缓冲区中有。这就是为什么您只能a输入as.

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

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

于 2013-10-19T16:35:39.130 回答
2
  1. 因为之后的新行vik仍在缓冲区中。所以第四个getchar()将处理新行。

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

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

int getchar(void);
于 2013-10-19T16:37:56.247 回答