什么是缓冲区?
临时存储区称为缓冲区。所有标准输入和输出设备都包含一个输入和输出缓冲区。在标准C / C++中,流被缓冲,例如在标准输入的情况下,当我们按键盘上的键时,它不会发送到您的程序中,而是由操作系统缓冲,直到分配给该时间为止。程序。
它如何影响编程?
在各种情况下,您可能需要清除不需要的缓冲区,以便在所需容器中而不是先前变量的缓冲区中获得下一个输入。例如,在遇到“ scanf()”之后为C的情况下,如果我们需要输入一个字符数组或字符,对于C++,在遇到“ cin”语句后,我们需要输入一个字符数组或一个字符串,我们需要清除输入缓冲区,否则所需的输入将被先前变量的缓冲区占用,而不是所需的容器。在第一个输入之后在输出屏幕上按“ Enter”(回车),因为先前变量的缓冲区为新容器的空间(因为我们没有清除它),程序将跳过以下容器的输入。
在C编程的情况下
// C Code to explain why not
// clearing the input buffer
// causes undesired outputs
#include
int main()
{
char str[80], ch;
// Scan input from user -
// GeeksforGeeks for example
scanf("%s", str);
// Scan character from user-
// 'a' for example
ch = getchar();
// Printing character array,
// prints “GeeksforGeeks”)
printf("%s\n", str);
// This does not print
// character 'a'
printf("%c", ch);
return 0;
}
输入:
GeeksforGeeks
a
输出:
GeeksforGeeks
如果是C++
// C++ Code to explain why
// not clearing the input
// buffer causes undesired
// outputs
#include
#include
using namespace std;
int main()
{
int a;
char ch[80];
// Enter input from user
// - 4 for example
cin >> a;
// Get input from user -
// "GeeksforGeeks" for example
cin.getline(ch,80);
// Prints 4
cout << a << endl;
// Printing string : This does
// not print string
cout << ch << endl;
return 0;
}
输入:
4
GeeksforGeeks
输出:
4
在上述两个代码中,输出均未按要求打印。原因是占用了缓冲区。 “ \ n”字符保留在缓冲区中,并作为下一个输入读取。
如何解决?
如果是C:
- 使用“ while((getchar())!=’\ n’); ” :键入“ while((getchar())!=’\ n’);”读取缓冲区字符直到结尾并丢弃它们(包括换行符),并在“ scanf()”语句清除输入缓冲区并允许将其输入所需的容器后使用它们。
// C Code to explain why adding // "while ( (getchar()) != '\n');" // after "scanf()" statement // flushes the input buffer #include
int main() { char str[80], ch; // scan input from user - // GeeksforGeeks for example scanf("%s", str); // flushes the standard input // (clears the input buffer) while ((getchar()) != '\n'); // scan character from user - // 'a' for example ch = getchar(); // Printing character array, // prints “GeeksforGeeks”) printf("%s\n", str); // Printing character a: It // will print 'a' this time printf("%c", ch); return 0; } 输入:
GeeksforGeeks a
输出:
GeeksforGeeks a
- 使用“ fflush(stdin)” :在“ scanf()”语句之后键入“ fflush(stdin)”也将清除输入缓冲区,但避免使用它,根据C++,对于输入流,它被称为“未定义” 11个标准。
如果是C++:
- 使用“ cin.ignore(numeric_limits :: max(),’\ n’); ” :-键入“ cin.ignore(numeric_limits :: max(),’\ n’);”在“ cin”语句之后,将丢弃输入流中的所有内容,包括换行符。
// C++ Code to explain how // "cin.ignore(numeric_limits //
::max(),'\n');" // discards the input buffer #include // for #include // for numeric_limits #include using namespace std; int main() { int a; char str[80]; // Enter input from user // - 4 for example cin >> a; // discards the input buffer cin.ignore(numeric_limits ::max(),'\n'); // Get input from user - // GeeksforGeeks for example cin.getline(str, 80); // Prints 4 cout << a << endl; // Printing string : This // will print string now cout << str << endl; return 0; } 输入:
4 GeeksforGeeks
输出:
4 GeeksforGeeks
- 使用“ cin.sync()”:在“ cin”语句之后键入“ cin.sync()”会丢弃缓冲区中剩余的所有内容。尽管“ cin.sync()”并非在所有实现中都有效(根据C++ 11和更高版本的标准)。
// C++ Code to explain how " cin.sync();" // discards the input buffer #include
#include #include using namespace std; int main() { int a; char str[80]; // Enter input from user // - 4 for example cin >> a; // Discards the input buffer cin.sync(); // Get input from user - // GeeksforGeeks for example cin.getline(str, 80); // Prints 4 cout << a << endl; // Printing string - this // will print string now cout << str << endl; return 0; } 输入:
4 GeeksforGeeks
输出:
4
- 使用“ cin >> ws”:在“ cin”语句之后键入“ cin >> ws”告诉编译器忽略缓冲区,并丢弃字符串或字符数组实际内容之前的所有空格。
// C++ Code to explain how "cin >> ws" // discards the input buffer along with // initial white spaces of string #include
#include using namespace std; int main() { int a; string s; // Enter input from user - // 4 for example cin >> a; // Discards the input buffer and // intial white spaces of string cin >> ws; // Get input from user - // GeeksforGeeks for example getline(cin, s); // Prints 4 and GeeksforGeeks : // will execute print a and s cout << a << endl; cout << s << endl; return 0; } 输入:
4 GeeksforGeeks
输出:
4 GeeksforGeeks
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程” 。