谈谈scanf与scanf_s的那些事

1.scanf与scanf_s的区分

在新版本vs中,用scanf输入字符串,数字等会提示错误,这时应该输入scanf_s。

这是因为很多带“_s”后缀的函数可以让原版函数更安全,而scanf_s就是这样。比如:

scanf()在读取数据时不检查边界,所以可能会造成内存访问越界:

//例如:分配了5字节的空间但是用户输入了10字节,就会导致scanf()读到10个字节
char buf[5]={'\0'};
scanf("%s", buf);
//如果输入1234567890,则5以后的部分会被写到别的变量所在的空间上去,从而可能会导致程序运行异常。

以上代码如果用scanf_s()则可避免此问题:

char buf[5]={'\0'};
scanf_s("%s",buf,5); //最多读取4个字符,因为buf[4]要放'\0'
//如果输入1234567890,则buf只会接受前4个字符

注: scanf_s最后一个参数n是接收缓冲区的大小(即buf的容量),表示最多读取n-1个字符.

2.scanf输入带空格字符串

scanf_s(scanf)此时视为相同。scanf是以空白符(空格、制表符、换行等等)为结束标志的,当遇到空白符是就会结束一次输入。还有,如果想取一行字符(包含空格等)用scanf是可以的,但"%s"是不行的,因为%s遇到空白字符(空格、制表符、\r、\n)就结束了,所以可以写成 "%[^\n]%*c",%[^\n]的作用就是读\n之外的所有字符,也就是说读到\n为止,%*c的作用就是把\n去掉,否则再次读的时候一直遇到的都是\n。(也可用gets()输入带空格字符串但一般不建议使用)

这篇文章,是我收集资料后总结的,算另类的翻译。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
scanfscanf_s都是用于从标准输入读取数据的函数。两者的功能相同,都可以读取不同类型的数据,如整数、浮点数、字符串等。 不同之处在于scanf_s是Microsoft公司的VS开发工具提供的一个安全版本的scanf函数,它在调用时需要提供一个数字参数,表示最多读取多少位字符。这样可以避免缓冲区溢出的风险。而scanf没有这个参数,它会根据格式字符串的要求一直读取字符,直到遇到空白字符为止。 另外,scanf_s要求在最后一个参数指定接收缓冲区的大小,即读取的字符个数不超过缓冲区的容量。而scanf没有这个要求,它会根据格式字符串的数据类型来确定读取的字符个数。 所以,如果你想要更加安全地读取输入数据,建议使用scanf_s。如果你对输入的控制比较严格,并且不担心缓冲区溢出的问题,也可以使用scanf。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [谈谈scanfscanf_s的那些](https://blog.csdn.net/zengjierong_plus/article/details/89251483)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [scanfscanf_s的区别、解决VS返回值被忽略的报错问题](https://blog.csdn.net/m0_68997646/article/details/130717098)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值