随机数的生成(两种方式)
- 不创建随机数种子,直接生成0—num区间的随机数
//不需要使用随机数种子的随机数生成函数
int RandomFunc1(int num){
int res = rand() % num;
return res;
}
- 使用随机数种子生成start-end之间的随机数
//通过随机数种子生成随机数
int RandomFunc2(int start, int end){
//种下随机数种子
srand(time(0));
//产生(start-end)之间的随机数
int res = rand() % (end - start) + start;
//产生[start-end] 之间的随机数
//int res = rand() % (end - start + 1) + start;
//产生(start-end]之间的随机数
//int res = rand() % (end - start) + start + 1;
return res;
}
由以上生成的简单验证码生成函数
由参数传入验证码的长度,生成的验证码存储在vector中
//随机验证码生成函数
void VerificationCodeFunc(vector<char> &vec, int len){
srand(time(0));
char tep;
for (int i = 0; i < len; i++){
switch (rand()%3)
{
case 0:
tep = rand() % 10 + '0';
break;
case 1:
tep = rand() % 26 + 'a';
break;
case 3:
tep = rand() % 26 + 'A';
break;
}
vec.push_back(tep);
}
}
由以上生成的验证码检验函数
通过键盘拿到输入的字符数组,进而进行比较(ASSIC)
//验证码检测函数
bool VerificationCodeDetectionFunc(vector<char> vec){
cout << "请输入验证码" << endl;
//通过使用get() getline() gets() 函数从键盘读入字符
char cha[10];
cin.get(cha, 10); //需要注意的是get没有溢出检测
//遍历传入的验证码字符数组,将二者进行比较
for (int i = 0; i < vec.size(); i++){
if (vec[i] != cha[i]){
return false;
}
}
return true;
}
由以上使用cin输入函数进行简单讨论
- cin最基本的输入,会过滤掉不可见的字符(如空格回车TAB等)
- cin.get(字符数组,长度,终止字符)函数 ,用于向字符数组中写入数据
- cin.getline(字符数组,长度,终止字符)函数 ,用于读取整行数据写入字符数组
- 以上两种方法不会检测缓冲区是否已满,如果输入的数据大于num值,那么就会出现溢出造成异常中止
- 重点讨论fgets()
原型如下:char fgets(charbuf, int n, FILE *fp)
功能:从文件流读取一行,送到缓冲区,使用时注意以下几点:
1.当遇到换行符或者缓冲区已满,fgets就会停止,返回读到的数据,值得注意的是不能用fgets读二进制文件,因为fgets会把二进制文件当成文本文件来处理,这势必会产生乱码。
2.每次调用,fgets都会把缓冲区的最后一个字符设为null,这意味着最后一个字符不能用来存放需要的数据,所以如果有一行,含有LINE_SIZE个字符(包括换行符),要想把这行读入缓冲区,请把参数n设为LINE_SIZE+1
- 由结论1可推出:给定参数n,fgets只能读取n-1个字符(包括换行符),如果有一行超过n-1个字符,那么fgets返回一个不完整的行,也就是说,只读取该行的前n-1个字符,但是,缓冲区总是以null字符结尾,对fgets的下一次调用会继续读该行。