C语言 我有两个与getchar()和putchar()相关的问题


#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()将执行时,它会在内存中创建一个缓冲区,并且整行内容将存储在缓冲区中,假设我在按回车键时写"vik"getchar()开始从缓冲区读取内容,然后"v"将分配给变量c,然后只有"v"将从缓冲区刷新,因为getchar()一次只读取一个字符。然后在下一个语句中,putchar(c) 在屏幕上打印"v"。所以现在"ik"留在缓冲区中,当第二个getchar()语句执行时,它不会再次要求用户写入一些东西,因为除非并且直到缓冲区不会完全刷新,否则它不会再次要求用户写入一些东西,而是从缓冲区读取内容。所以这里的"ik"保留在黄油中,所以在第二个 getchar() 语句中从缓冲区读取"i",然后"i"将再次从缓冲区刷新,putchar(c) 打印"i"。现在,当 3rd getchar() 执行它时,"k"留在缓冲区中,从缓冲区读取"k"并连接到 c,然后"k"也从缓冲区刷新。现在此时缓冲区已完全刷新,当第 4 个 getchar() 将执行其对用户写入内容的请求时,缓冲区中没有内容,因为缓冲区中没有内容,所以假设我写"as"并点击 enter。现在我的主要问题是,当我给两个内容"as"并且有两个getchar()和putchar(c)要执行时,为什么只有"a"会在屏幕上打印为什么不打印"s"呢?

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

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

不。缓冲区中有n。这就是为什么你只得到a输入as

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

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

  1. 因为vik之后的新行仍在缓冲区中。因此,第四getchar()将处理新行。

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

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

int getchar(void);

最新更新