CIN流
cin是一个来自C++的IOSTREAM中的库函数器件。cin的含义为标准输入流,一般指键盘。
使用cin时可以遵从“>>变量”的模式,具体用法案例如下:
#include<iostream>
int main()
{
char * a = new char[100];
char line[]="string";
int s;
int i = 1;
while (true){
std::cout << "Welcome!"<<"term "<<i << std::endl << std::endl;
if (!(std::cin >>a>> s))
{
std::cin.clear();
std::cin.ignore(INT_MAX, '\n');
printf("cin erro\n");
}
else {
printf("cin is : %s && %d\n", a, s);
}
i = i + 1;
std::cout << std::endl;
}
return 0;
}
其中“cin>>变量”本身其实就是一个函数,其返回值代表标准键盘流输入有无错误,如有错误,则会报错。键盘输入的数据,按下enter后会进入缓冲区,只要缓冲区有数据,cin就会直接读取不会暂停。
cin函数本身从键盘流输入,因此会有键盘流的等待时间。cin在获得键盘流的数据之后,即便是出现了错误,也不会释放缓存。如需释放缓存,需要使用以下代码:
//C++:清除输入缓冲区的所有内容,直到遇到回车符为止, 各种编译器都有效
std::cin.clear();
std::cin.ignore(INT_MAX, '\n');
这里需要首先使用.clear()函数恢复cin的指针位置,保证ignore函数可以正常使用。
完成后可以看到,cin输入后会不间断的读取缓存区内的数据,直至读不出数据后,进入阻滞状态等待键盘输入。如果cin指向的变量不止一个,且缓存区没有足够的数据喂给这些指向的变量时,也会进入阻滞状态等待键盘的输入。
char *与char[]的问题
这两个本质上是一个东西,理论上是可以通用的。char*的变量是一个long long类型(x64系统,8位字节),指代的是地址。char[] 指代的是一个数组名称变量,是一个结构体,数组占多大内存,变量就多大。
实际使用中,%s可以对char * char[] 通用。char[]作为变量,在声明时会对其长度进行一次初始化,而char *则不用。char *如果想被用在一些函数中,需要提前声明char * 的内存地址。
这里注意,char *初始化如果声明到null的话,容易引起一些bug。
函数调用char *时,如需初始化char *,建议使用下面的方法:
char * a = new char[100];