假设我们现在正在开发一款文档管理类软件。其中一项功能就是一次性创建多个名称连续的文件夹,如Icon1、 Icon2等等。整个名称可以分作两部分,前半部分是常量字符串"Icon",后半部分是编号字符串。在使用循环语句生成名称时,编号是数字,如果能将编号转换为一个字符串,那么我们就可以用strcat函数将两部分组合起来,然后使用mkdir创建文件夹即可。因此,现阶段问题就变成了如何把数字转换为对应的字符。
现在又到了查看ASCII码表的时候了,通过查表我们可以看到,字符'0',对应的ASCII码是48,也就是说数值48,转换为char类型就是字符'0',根据这个简单的对应关系,我们就可以生成名称了。
我们输出编号从0-9的名称,整体效果还不错。不过,我想你也看到局限性了,如果要生成编号大于10的名称,这个程序就像小孩数指头做算术一样,不够用了。
在这一文明阶段的,我们的思考认知能力有了巨大的提升,我们希望能根据指定的一个区间生成对应的名称,如Icon17到Icon35,同时还希望前导名称能够指定,就像是Name999-Name1234一样。同样,最关键的问题还是数值到字符串的转换,因为现在的数值范围更大了,需要的处理也就更多了。让我们尝试编写一个函数去解决这个问题。
注释中【相当于num-=factory】有误
现在我们进化到了三阶文明,在这一阶段,我们不再需要自己编写复杂的数值转换字符串函数了。而是使用本阶文明提供的函数来完明,这个函数就是itoa,它由stdlib.h提供。
原型名:char*itoa( int value, char *string, int radix );
value是被转换的整数,string是转换后储存的字符数组,radix是转换进制数,如2,8,10,16进制。
想想看,如果我们仅仅是要输出符合要求的名称,那么使用 printf("Icon%d", 83); 之类的语句即可达到要求。在这一文明阶段,C语言运行时库进化出了格式化字符串函数sprintf。
不同于printf将信息输出到屏幕(确切的说是标准输出),sprintf将格式化后的字符串输出到对应的字符数组,一击达到目的,其相应的安全版本是sprintf_s。同printf一样,可以使用格式化控制符,可以帮助我们生成补齐的文件夹名称。在运行完这个程序后,转到对应的工程目录,你会发现Icon98 Icon99... 静静的躺在那儿。
通过这节内容的学习,希望能帮助你更深刻的理解ASCII码表、更好的操作数组,熟悉C提供的字符串函数。对于C语言字符串函数,建议你更多的使用其安全版本。最后要说明的是,做为练习,你可以写一个数字转换为字符串的函数;做为开发,你可以先去查找语言提供的库是否包含有你需要的功能,有,就用它!