| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2650 人关注过本帖
标题:请教下这两个代码的区别
只看楼主 加入收藏
li362490567
Rank: 1
等 级:新手上路
帖 子:89
专家分:8
注 册:2015-7-9
结帖率:0
收藏
 问题点数:0 回复次数:8 
请教下这两个代码的区别
#include<stdio.h>
int main(void)
{

    char ch;
    printf("Please enter a character.\n");
    scanf_s("%c",&ch,1);
    printf("The code for%c is%d.", ch, ch);
    return 0;
}


#include<stdio.h>
int main(void)
{


char ch;
printf("Please enter a character.\n");
scanf_s("%c",&ch);
printf("The code for%c is%d.", ch, ch);
return 0;
}
这俩段代码的区别,唯一的差别就是scanf_s 中的ch 后多了个,1  这有啥区别?求高手解答,另外我用的编译器是VS2015 为何只能用scanf_s函数而不能用scanf函数
搜索更多相关主题的帖子: character include return 编译器 
2015-07-09 15:48
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
这有啥区别?
------ scanf_s 就是这样用的呀,没法回答

VS2015 为何只能用scanf_s函数而不能用scanf函数
------ 关闭SDL试试
2015-07-09 16:03
lianyicq
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:26
帖 子:737
专家分:3488
注 册:2013-1-26
收藏
得分:0 
回复 楼主 li362490567
看看MSDN是如何说的https://msdn.(v=vs.140).aspx

大开眼界
2015-07-09 16:32
hjx1120
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:李掌柜
等 级:贵宾
威 望:41
帖 子:1314
专家分:6927
注 册:2008-1-3
收藏
得分:0 
用vs学习C语言,我笑了,这和还没学会爬就想跑有区别嘛
2015-07-09 17:03
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
scanf_s()是vc推荐的安全版本函数,用于绕过标准库版本scanf()函数溢出漏洞的,强制使用scanf()也可以,但那个漏洞是众所周知的,那么所写的程序破绽在哪里,不用多少高深黑客技能也能攻击。

你1楼所问的,为什么多了一个1?那是scanf_s()函数改进scanf()的措施之一,即告诉scanf_s()函数,由于你使用"%c",逻辑上只接受1个char,参数1就是限制实际读取的字符数。对"%c"而言,scanf()也可以用"%1c"限制,scanf_s()没什么优势,但可以用scanf_s("%4c", s, 4)这样代码读入4个字符构成字符数组,不用'\0'结束,这是读数组不是读字符串。但对"%s"则不同,当预备的字符串缓冲区空间不确定的时候,比如char s[5],要写出诸如"%4s"那样的控制串是比较麻烦的,用scanf_s()就可以不靠"%4s",而是用多一个参数_countof(s)即可,这样编译器计算出_countof(s)的值为5(_countof()只能算数组,不能算指针所指向的空间,当数组因传参被蜕化为指针时,就无法用这个算尺寸,这也是数组和指针不等同的证据之一,别听人说数组就是指针,那害死你),减去1填写在那个参数位置,形成scanf_s("%s", s, 4)的代码,表明只读入4个字符长的数据,而存储区的尺寸是5。

scanf("%s", s)的代码,当用户键入超过s尺寸的字符时,会导致程序运行出错。要写成scanf("%4s", s),则要在前面动态把s的空间算出来,用sprintf()生成"%4s"的控制字符串,再调用scanf()。

[ 本帖最后由 TonyDeng 于 2015-7-9 17:11 编辑 ]

授人以渔,不授人以鱼。
2015-07-09 17:03
实际应用
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:89
专家分:341
注 册:2015-5-30
收藏
得分:0 
据说
c11标准里有,可惜只有微软实现了
2015-07-09 22:25
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
每家编译器厂商提供的标准库,都有各自的实现方式(即编写那些函数的代码是各不相同的),在对外表现符合标准之后,通常还有不少独特的扩展。比如同样是scanf()系列函数,微软就有大写"%C"和"%S"的扩展,那是输出wchar_t宽字符的,即用ansi版本的函数处理Unicode字符和字符串;同样,宽字符版本的wscanf()系列,也可以用大写的"%C"和"%S"来处理ansi字符和字符串;两者互相反着来。这些都是适应新环境做出的扩展,没人会死守标准的。

授人以渔,不授人以鱼。
2015-07-09 22:41
T_MACC
Rank: 4
等 级:业余侠客
威 望:8
帖 子:99
专家分:211
注 册:2015-4-14
收藏
得分:0 
回复 7楼 TonyDeng
你是搞开发的吗   细节真号
2015-07-12 13:08
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
收藏
得分:0 
回复 5楼 TonyDeng
2015-07-14 13:12
快速回复:请教下这两个代码的区别
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.011631 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved