CRT函数相关问题,gets_s和strcpy_s的用法

      先说些题外话。

      C和C++被我遗忘在角落许久,最近想转行做程序员的念头剧增,于是开始了系统的复习。

      只学过C++,C在学校没学过,只是兴起时翻了翻一些书本。不过听说C是基础,于是买了本谭浩强老师的《C语言程序设计》学了起来。

      C语言不难,但是学起来也有些小波折。计算机软硬件和各种知识飞速发展,而学习的教材却有严重的滞后性,这给我这样没有指导老师的自学者带来的许多阻碍。

       因为在学校时不知努力和没有正确的学习方法,导致学习是一塌糊涂。毕业以来自然生活艰辛,漂泊无依,没有一个安定的学习环境,只是胡乱的看些书学习着。2014年生活略微稳定,小有余资,在京东网购配件组装了台电脑。既然弄自然要弄好的,硬件配置高,软件自然也不能含糊。32位操作系统虽然用着也没问题,而且配套软件更全,但还是装了64位的win7操作系统,听说win8触摸屏用起来才好,而且win7已经久经考验,值得信赖。

        要学编程就要有一个编程工具,据我所知学C语言和C++用的最多的是集成开发环境VC6.0。在网上找了许久,找到一个安全性还可以的,下载了。安装时才发现是32位的用不了,找不到64位的也没找到使其能够运行于64位操作系统上的办法。最后,只得在MSDN我告诉你上下载了VS2013,又找了个密匙,安装成功,正式开始学习。

       学编程最重要的是要实践要敲代码,这是共识,也是我的体验,光看书效果太差。敲书上的代码,先试着自己编程,做不出来再看书上的的代码。

       在敲代码的过程中,发现了一些问题。printf和scanf函数是C语言中最常用的输入输出函数,用2013编译时提示错误,说这两个函数不安全,建议使用printf_s和scanf_s代替。查了一下,因为时间和精力有限学习为先,这些就没有深究,能用就是了。

       但是当学到数组时,又遇到问题了,字符串输入函数gets和字符串复制函数strcpy在编译时又遇到同样的问题,按照建议使用了gets_s和strcpy_s还是不行。先放过,继续学习下去。但是解决不了这个问题,题目就做不了,于是某天空闲时琢磨起来。

       发现这些都属于CRT函数,安全CRT(C Runtime Library = C运行时间库)函数,是微软公司对C/C++语言的扩展,其中的部分内容已于2003年提交给ISO作为C/C++标准下一版本的修改建议。它在原来函数名后添加了“_s”后缀;一般返回出错代码;并将原来的函数返回值,作为一个参数,添加到函数输入参数列表的最后;对带缓冲区参数的函数,还添加了表示缓冲区大小的输入参数,以防止内存溢出。详情见msan上CRT库的功能和CRT中的安全功能。

      下面说具体事例。

      一是例子6.8输入一行字符统计有多少单词的题,需要定义一个字符数组char string[81];要输入一个字符串给字符数组string。用gets函数编译不通过,用gets_s(string);还是不通过,这是因为gets_s需要第二个参数,为缓冲区大小改成gets_s(string,81);顺利编译通过,运行正确。

     二是例子6.9三个字符串,找出其中最大者的题,定义二维数组char str[3][20];又定义了一维数组string作为交换字符串时的临时字符数组。先for (i = 0; i < 3; i++) 

gets_s(str[i], 20);         //读入3个字符串,分别给str[0],str[1],str[2],然后要比较大小和将大者赋给字符数组string。相应的也要有各参数作为缓冲区的大小,如把str[0]的字符串赋给字符数组string ,可以用strcpy_s(string,sizeof(str[0]), str[0]);。

     终于解决了,这些问题虽小,却是通过努力解决的,增强了我的学习信心。也让我明白,学习就是要靠努力,要去实践要去做,空想是成不了事情的。要勇于面对新事物,勇于迎接各种挑战,只有这样自己和人类的明天才能更好!

      自从找回了csdn账号,就又要写博客发些文章想法,但是一直不知写些什么好。今日想起,就放下学习工作,花些时间码了这篇文字,希望能给需要的人带来一些帮助。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值