c++ 标准语句 结尾_清除C / C ++中的输入缓冲区,妈妈再也不用担心我的学习

什么是缓冲区?
临时存储区称为缓冲区。所有标准输入和输出设备都包含一个输入和输出缓冲区。在标准C / C ++中,流被缓冲,例如在标准输入的情况下,当我们按键盘上的键时,它不会发送到您的程序,而是由操作系统缓冲,直到分配给该时间为止。

95bf1a7f638eb9bc0a149daaf22d9030.png

它如何影响编程?
在各种情况下,您可能需要清除不需要的缓冲区,以便在所需容器中而不是先前变量的缓冲区中获取下一个输入。例如,对于C遇到“ scanf()”后,我们需要输入一个字符数组或字符,对于C ++,遇到“ cin”语句后,我们需要输入一个字符数组或一个字符串,那么我们需要清除输入缓冲区,否则所需的输入将被先前变量的缓冲区占用,而不是所需的容器。在第一个输入之后在输出屏幕上按“ Enter”(回车),因为先前变量的缓冲区为新容器的空间(因为我们没有清除它),程序将跳过以下容器输入。

ae15513f52b7837a783b182014273186.png

如果是C编程

#include
int main()
{
char str[80], ch;
scanf("%s", str);
ch = getchar();
printf("%s\n", str);
printf("%c", ch);
return 0;
}

输入:

girl
a

输出:

girl

如果是C ++

#include
#include
using namespace std;
int main()
{
int a;
char ch[80];
cin >> a;
cin.getline(ch,80);
cout << a << endl;
cout << ch << endl;
return 0;
}

输入:

4
girl

输出:

4

在上述两个代码中,输出均未按要求打印。原因是占用了缓冲区。“ \ n”字符保留在缓冲区中,并作为下一个输入读取。

如何解决?

如果是C:

1.使用“ while((getchar())!='\ n'); ”:键入“ while((getchar())!='\ n');” 读取缓冲区字符直到结尾并丢弃它们(包括换行符),并在“ scanf()”语句清除输入缓冲区并允许输入所需的容器之后使用它们。


#include
int main()
{
char str[80], ch;
scanf("%s", str);
while ((getchar()) != '\n');
ch = getchar();
printf("%s\n", str);
printf("%c", ch);
return 0;
}

2.使用“ fflush(stdin)”:在“ scanf()”语句之后键入“ fflush(stdin)”也将清除输入缓冲区,但是避免使用它,并且根据C ++,对于输入流,它被称为“未定义” 11个标准。

如果是C ++:

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

#include
#include
#include
using namespace std;
int main()
{
int a;
char str[80];
cin >> a;
cin.ignore(numeric_limits::max(),'\n');
cin.getline(str, 80);
cout << a << endl;
cout << str << endl;
return 0;
}

2.使用“ cin.sync()”:在“ cin”语句之后键入“ cin.sync()”会丢弃缓冲区中剩余的所有内容。尽管“ cin.sync()”并非在所有实现中都有效(根据C ++ 11和更高版本的标准)。

#include
#include
#include
using namespace std;
int main()
{
int a;
char str[80];
cin >> a;
cin.sync();
cin.getline(str, 80);
cout << a << endl;
cout << str << endl;
return 0;
}

3.使用“ cin >> ws”:在“ cin”语句之后键入“ cin >> ws”,告诉编译器忽略缓冲区,并丢弃字符串或字符数组实际内容之前的所有空格。

#include
#include
using namespace std;
int main()
{
int a;
string s;
cin >> a;
cin >> ws;
getline(cin, s);
cout << a << endl;
cout << s << endl;
return 0;
}

当然,还有别的方法,这个就看你们的了。这里只是给你们提出几个解决办法。

3f09014887cfe45c218dce7468f03d53.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值