C/C++ 中清空输入缓冲区

2024年8月28日 | 阅读 4 分钟

在本教程中,我们将学习什么是缓冲区以及如何在 C 和 C++ 中清除输入缓冲区。

缓冲区到底是什么?

缓冲区是一种临时存储。每个标准输入和输出设备都有一个输入和输出缓冲区。在传统的 C/C++ 中,流是缓冲的。例如,当我们按下键盘上的一个键时,它会传送到操作系统的缓冲区并一直保留在那里,直到分配给该程序的时间结束。

它对编程有什么影响?

在某些情况下,我们可能需要清空不需要的缓冲区,以便将下一个输入接收到所需的容器中,而不是前一个变量的缓冲区中。例如,在 C 语言中,如果我们要输入字符数组或字符,我们必须清空输入缓冲区;在 C++ 中,我们必须清除输入缓冲区;否则,预期的输入将由前一个变量的缓冲区保留,而不是由所需的容器保留。因为前一个变量的缓冲区是新容器的空间(因为我们没有清除它),当我们在第一次输入后在输出屏幕上按下“Enter”(回车)时,计算机就会错过下一个容器输入。

C 语言程序

输出:(如果用户输入 javaTpoint c)

javaTpoint c
javaTpoint

时间复杂度将为:O(1)。

C++ 程序

输出:(如果用户输入 20 javatpoint)

Now enter the values
20 Javatpoint
This is the generated output
20
 Javatpoint

时间复杂度将为:O(1)。

在上述任一代码中,输出都没有按预期生成。这是由于缓冲区被占用。字符“\n”保留在缓冲区中并作为下一个输入进行处理。

最好的解决方法是什么?

在 C 的情况下

使用“ while ((getchar()) != '\n'); ”: 输入“while ((getchar())!= 'n');”会读取缓冲区字符直到末尾并将其丢弃(包括换行符),当在“scanf()”语句之后使用时,它有助于删除输入缓冲区并允许输入到所需的容器中。

C 语言程序

输出:(如果用户输入 javaTpoint c)

javaTpoint c
javaTpoint c

时间复杂度将为:O(n),其中 n 表示字符串的大小。

使用“fflush(stdin)”: 在“scanf()”命令后键入“fflush(stdin)”也有助于清除输入缓冲区,但它通常被忽略,并且在 C++11 标准中被标记为输入流的“未定义”。

在 C++ 的情况下

1. 使用“cin.ignore(numeric_limits::max(),'\n'); ”:- 在“cin”语句之后,放置“cin.ignore(numeric_limits::max(),'\n');”会丢弃所有输入流,包括换行符。

C++ 程序

输出

Now enter the values
5 
JTP
Here is the output
5
JTP

时间复杂度将为 O(1)。

2. 使用“cin.sync() ”: 在“cin”语句之后键入“cin.sync()”会删除缓冲区中的所有内容。尽管“cin.sync()”可能并非在所有应用程序中都有效(根据 C++11 及更高标准)。

C++ 程序

输出

Now enter the values - 
1 
This is a program

Here is the output -
1
This is a program

时间复杂度将为 O(1)。

3. 使用“cin >> ws”: 在“cin”指令之后放置“cin>>ws”会指示编译器忽略缓冲区并删除字符串或字符数组实际内容之前的所有空格。

C++ 程序

输出

Now enter the values - 
3
Demo program

Here is the output -
3
Demo program

时间复杂度将为 O(1)。