在自己写图书管理系统项目的时候,遇到了挺多问题的。这个问题比较严重,就是在自己循环增加图书的时候用char c=getchar()
取得是缓冲区字符,因此不知道缓冲区是否还会存在数据。所以有一下几种方法;
所谓缓冲区,就是字符由键盘输入的时候,先进缓冲区,不会直接进入硬盘,这样相对来说能提高效率,scanf和cin都是从缓冲区去获取数据的。
以下例子是关于缓冲区的例子:
#include<stdio.h>
void main()
{
int m;
fputs("请输入一个数字:",stdout); //标准输出到硬盘上
scanf("%d",&m);
printf("%d",m);
}
先介绍一下fputs函数,fgets()函数是从文件中读取数据,fputs函数是将数据写入到文件中。例如:
FILE *fp=fopen("test.txt","w");
char s1[20]="hello world";
char *s2="hello C";
fputs(s1,fp); // 数组名
fputs(s2,fp); //字符指针
fputs("hello",fp); //字符串常量
上面三种用法都是可以的,实质上, C语言中字符串的直接值其实都是指针。
也可以直接用fputs("内容",stdout);将文件输出到屏幕上;
程序运行时如果输入的是一个整数,则会正常scanf从缓冲区获取数据,正常输出。但当输入的不是整数时,scanf函数将不会从缓冲区获取,所以一直无限循环 fputs("请输入一个数字:",stdout); 无限循环下去;
所以必须要有清除缓冲区的办法;这里介绍几种C++清除缓冲区的办法:
(1)利用fflush(stdin)清除缓冲区
但是这种方法现在基本被淘汰,fflush(stdin)不是C/C++的库函数,只是延伸函数,所以建议不要使用;
(2)利用setbuf(stdin,NULL):这个函数在我看来比较好用,直接将输入缓冲区清空,但是在我写图书管理系统,用同学的电脑能正常编译,用我的电脑就会出现一点小bug。这个只能说看自己的吧。
1.stdin:标准输入,即从键盘输入的字符、数字、标点符号等信息。
2.stdout:标准输出,显示器屏幕显示,或输出到磁盘,或打印机打印出来的信息。
当一个用户进程被创建的时候,系统会自动为该进程创建stdin(=0)、stdoutr(=1)等数据流
setbuf()函数还有一点用法;可以利用setbuf()自己建立一个缓冲区;
#include<iostream>
using namespace std;
void main()
{
char c;
char buffer[256];
setbuf(stdout,buffer);
while((c=getchar())!=EOF)
{
cout<<c<<endl;
}
}
(3) 利用while((c=getchar())!='\n' && c!=EOF) 来清除缓冲区,这个方法比较不错,就是写的啰嗦;
(4)利用cin.ignore(INT_MAX,'\n')来清除缓冲区,我觉得这个方法是最好的选择,简单。
下面是我在实验这些函数写的一些代码,方便调试时更容易掌握;
#include <stdio.h>
#include<iostream>
using namespace std;
int main()
{
char c;
char ch[10];
char *p;
p = ch;
int i = 0;
while (i< 2)
{
printf("input a char:\n");
scanf("%c", &ch[i]);
char c = getchar();
while (c != '\n')
{
cout << c << endl;
}
//while ((c = getchar()) != '\n'&&c != EOF);
//cin.ignore(INT_MAX,'\n');
setbuf(stdin, NULL);
i++;
}
i = 0;
while (i<2)
{
printf("输入%c\n", *(p++));
i++;
}
return 0;
}