本文中的随机字符串是指从大写字符’A’到‘Z’中选定一个或多个字符而构成的字符串,字符串的最小长度为1,最大长度为26。程序使用了两层while循环语句。外层循环功能是控制多次输入字符串的长度,并将生成的字符串打印至屏幕上,内层循环为构建随机字符串。主函数main不添加功能相关代码,只是负责调用其它功能的函数。
图1中的代码第13-21行为外层循环语句,在这个循环语句中,它负责调用获取字符串长度的inputLength函数,构建字符串的buildString函数和显示字符串的print函数。在代码第15行,调用了标准库中的malloc函数,使用此函数的目的是根据用户输入的字符串长度值保证所申请的内存正是所需要的内存,无多余的内存申请,也不会出现内存不足的现象。这个函数所申请的内存属于堆内存,当程序不再使用这块内存之后,必须通过函数free进行内存释放,否则会出现内存泄漏问题。
程序运行时提示用户输入随机字符串的长度是多少,合法的取值范围为1-26,输入其它的数值程序会直接退出运行,对应的函数inputLength见下图2所示。
代码第37行提示用户生成的字符串长度的信息,如果用户输入的内容不是数字或者输入的数值没有位于1-26的范围之间,那么程序将直接退出,返回值为-1。
如果用户输入的字符串长度合法,那么程序会动态地分配一块内存区域用以保存生成的随机串,随机串的内容是通过字母列表’A’-‘Z’和随机函数rand而实现的。随机函数生成一个伪随机数,这个伪随机数会通过公式映射为一个0-25之间的一个数值,作为字符表的索引值,每次执行伪随机函数都会对应地得到一个索引值。
代码第28行计算出伪随机数相对于RAND_MAX的比率,之后通过第29行代码,转换为字母表的索引值index,index的范围为0-25,接下来通过字母表的起始字符’A’和索引值计算出对应的随机字符了,第30行代码为每一次计算出一个随机字符。
程序的最后为字符串的输出,输出函数print接收一个参数,即待输出的字符串,这个字符串输出格式按照一行5个字符的长度进行输出,图5中代码第58行通过判断当前字符的索引值来决定是否需要输出换行符,如果索引值为5的倍数,则执行输出换行字符,但是首行索引为0是不需要输出换行字符的。如果待显示的字符串长度不为5的整倍数,那么,最后一行字符就不会执行第59行中的代码,即丢失了输出换行符,为此,代码第63行添加了对非整行字符的判断逻辑,如果最后一行字符串的长度小于5,第64行代码会执行换行符的输出操作。