学习、实验记录,也是方便自己以后查找
两种实现思路
C、C++使用同一种思路,只是使用的数据结构不一样
C、C++中直接产生随机的字符串的库函数目前是没有的,我们可以自己写一个,
第一种实现思路-随机数转char
-
产生固定长度的随机的字符串
主要就是产生固定个数的随机字符,
那么就简单了,用两组随机数:
一组:随机产生0~25的整数num,然后用’a’+num来赋值小写字母,‘A’+num来赋值大写字母
一组:随机产生0,1,产生0,就生成小写字母;产生1,就生成大写字母;
-
产生不固定长度的随机的字符串
就是在上面的产生固定长度的随机的字符串的基础上,在引入一组随机数,来控制字符串长度
C语言中没有关于字符串的定义,在C中要定义字符串必须使用数组或者指针,如 char a[10];
或者 char *a = “sfg”
。所以,分别以char
数组和char*
各自做一遍。
第二种思路-随机数取字符
生成指定长度的字符串,还有一种简单暴力的方法。构造一个包含需要的字符的字符数组或者是字符串。通过生成其个数之内的随机数,决定将哪一个字符附加到字符串末尾。
这种方式,只需要一个随机数就可以了。如果要生成随机长度的字符串,再加一个随机数就可以了。
C语言,使用char数组
实现代码:
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//C使用char数组方式生成指定长度随机字符串
void generCharArray(int len)
{
int flag,i;
char ch[len+1]={NULL};//注意要多分配一个字节来保存字符串最后的结束符
srand((unsigned)time(NULL));
for(i=0;i<len;i++)
{
flag=rand()%2;
if(flag) ch[i]='A'+rand()%26;
else ch[i]='a'+rand()%26;
}
ch[i]='\0';
printf("生成的%d个字符长度随机数字符串\n",len);
printf("%s\n",ch);
//return ch;
}
int main()
{
generCharArray(10);
getch();
return 0;
}
运行截图:
C语言,使用char*
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//C使用char*方式生成指定长度随机字符串
void generString(int len)
{
char* string = new char[len+1];//注意要多分配一个字节来保存字符串最后的结束符
int flag,j;
srand((unsigned)time(NULL));
for(j=0;j<len;j++)
{
flag=rand()%2;
if(flag) string[j]='A'+rand()%26;
else string[j]='a'+rand()%26;
}
string[j]='\0';
printf("生成的%d个字符长度随机数字符串\n",len);
printf(string);
//return string;
}
int main()
{
generString(10);
getch();
return 0;
}
要注意new后面的符号
-
()
: 分配这种类型的一个大小的内存空间,并以括号中的值来初始化这个变量
-
[]:
分配这种类型的n个大小的内存空间,并用默认构造函数来初始化这些变量
创建char* 变量,如果用char *p=new char("absd");
是分配一个char(1字节)的空间,用"absd"来初始化。
应该使用char *p=new char[6];
方式。
注意这里new时要多分配一个字节来保存字符串最后的结束符(\0
)。
运行截图:
C++ 使用string类
在C++中有一种更简单的方法,那就是string类, 可直接定义字符串, 例如string s(“sdgfhl”); 而且有一个好处是字符串的长度是可变的。
#include<cstdio>
#include<time.h>
#include<stdlib.h>
#include <string>
#include<iostream>>
using namespace std;
//C++方式生成指定长度随机字符串
string gengerString(int n){
srand((unsigned)time(NULL)); //产生随机化种子
printf("生成%d个字符的字符串\n",n);
std::string str = "";
for(int i=1;i <= n;i++)
{
int flag;
flag = rand()%2; //随机使flag为1或0,为1就是大写,为0就是小写
if(flag == 1) //如果flag=1
str += rand()%('Z'-'A'+1)+'A'; //追加大写字母的ascii码
else
str += rand()%('z'-'a'+1)+'a'; //如果flag=0,追加为小写字母的ascii码
}
cout<<str<<endl; //将字符串输出
return str;
}
int main()
{
gengerString(10);
return 0;
}
运行截图:
Java通过字符数组或字符串方式
生成指定长度的字符串,还有一种简单暴力的方法。构造一个包含需要的字符的字符数组或者是字符串。通过生成其个数之内的随机数,决定将哪一个字符附加到字符串末尾。
这种方式,只需要一个随机数就可以了。如果要生成随机长度的字符串,再加一个随机数就可以了。
如果需要生成只有包含大小写英文字符的字符串,就是52位,如果要加上数字0-9的话就是62位。如果需要生成包含其他指定字符的字符串,只需要改一下str字符串,把需要的字符写入就好了。
需要生成包含那些字符的字符串,直接修改str就好了。
实现代码:
//生成指定长度字符串
public static String generString(int len){
/**生成指定长度的随机字符串
*/
//定义一个字符串(A-Z,a-z)即52位;
String str="zxcvbnmlkjhgfdsaqwertyuiopQWERTYUIOPASDFGHJKLZXCVBNM";
int strLen = str.length();
//由Random生成随机数
Random random = new Random();
StringBuffer sb = new StringBuffer();
for(int i=0; i< len; i++){
//产生0-strLen的数字
int number = random.nextInt(strLen);
//将产生的数字通过len次附加到sb中
sb.append(str.charAt(number));
}
//将StringBuffer类字符串转换成字符串
return sb.toString();
}
运行截图:
—END–