扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
应该是gets_s函数吧
站在用户的角度思考问题,与客户深入沟通,找到朝阳网站设计与朝阳网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都网站制作、网站建设、企业官网、英文网站、手机端网站、网站推广、空间域名、网站空间、企业邮箱。业务覆盖朝阳地区。
对应头文件stdio.h
原型:
char *gets_s(char *buffer,size_t sizeInCharacters);
调用形式:
gets_s(buffer,sizeInCharacters) ;
其中第二参数就是允许的输入长度, 这里的size应该分配为buffer-1的长度,因为函数自动为'\0'分配空间的时候会溢出。和gets的区别就是gets读入不限制输入长度,所以在2011年12月,ANSI 采纳了 ISO/IEC 9899:2011 标准,标准中删除了 gets()函数,使用一个新的更安全的函数gets_s()替代
//摘自百度百科
#include stdio.h//gets_s()用法
#define CH 20
int main(void)
{
char ch[CH];
printf("请输入你的名字:\n");
gets_s(ch,CH); //这里不能用gets_s(ch);
printf("这是你的名字:%s\n", ch);
return 0;
}
scanf和scanf_s是不同的函数,他们接受的参数不同
VS的人觉得scanf对字符串的处理“不安全”,所以搞了一套“安全函数”,这样在缓冲区不够大的时候就可以让程序“光荣地”崩溃(默认行为是让程序非正常退出,个人把它称为崩溃。也可以让程序执行之前设定的函数)
不过也有人认为这一套并不是理想的形式,因为所谓的“安全函数”要让用户传入缓冲区的大小,如果用户乱传反而更严重。这些人的做法是让函数动态分配字符串所需要的内存,返回动态分配的字符串,因为是函数内部动态分配,函数知道需要分配多少,就可以保证缓冲区足够大,不会有下标越界带来的问题,使用者只需要记得在用完字符串之后 free 掉——虽然因为C语言没有显式规定的自动内存管理所以不管怎样做不到不用使用者操心就能完美处理字符串
1、使用区别
scanf()不会检查输入边界,可能造成数据溢出。
scanf_s()会进行边界检查。
2、意思
scanf表示从键盘输入指定格式的数据。如:scanf("%d",x);指从键盘给x输入一个int型(整型)数据;scanf("%f",x);指从键盘给x输入一个float型(实型)数据;
对应的输出为:printf 按照指定的格式输出数据;如printf("%d",x); 指按整型数据输出X中的值。
因为带“_s”后缀的函数是为了让原版函数更安全,传入一个和参数有关的大小值,避免引用到不存在的元素,防止hacker利用原版的不安全性(漏洞)黑掉系统。
3、scanf_s()参数与scanf()不同
例如scanf(“%s”,name,n),整形n为name类型的大小,如果name是数组,那n就是该数组的大小。
二者都是从终端读入字符串。功能为
1、 gets功能为读入一行,并将换行符转换为字符串结束符。
2、 scanf("%s",s);读入时,遇到空白字符,包括空格,制表符,换行符时均会停止输入。
从功能上可以看出不同之处:
1 终止条件不同。gets只有遇到\n时才会结束输入,而scanf遇到空格或制表符时,也会结束输入。
比如输入"test string\n"。
用gets得到的字符串为"test string", 二用scanf得到的是"test"。
2 终止后,对终止字符处理不同。
比如输入为"test\nabcd"。
执行gets后,\n不会留在缓冲区中,即这时调用getchar得到的字符是'a'。
执行scanf后,\n会留在缓冲区,这时调用getchar得到的字符是'\n'。
在C语言中用到数值范围一般有如下两种情况:
1 逻辑判断中确定某数在某个范围内。
比如判断数c在[a,b]区间内可以写作
(a=c) (c = b)
2 使计算结果处于某个范围内。
比如计算时间时,当前时间为n点,经过m小时后是几点,由于时间仅取值在0点到23点,所以对数值范围需要做约束。对于此可以用模除(%)来限定。
(n+m)%24
其它关于数值范围限定的问题,都可以从这两种情况中延伸获得。
比如下面两个例题就是两种情况的应用。
例一,输入起始天的星期数(1-7),及天数n,计算经过n天后是星期几。
分析,这个是第二种的典型应用,不过数据规模为1到7,与之前说的0起始情况略有不同,可以通过转换达到目的,代码如下:
#include stdio.h
int main()
{
int s,n;
scanf("%d%d",s,n);
s --;//将s-1;这样用0-6代表星期一到日
s +=n;
s%=7;//通过模除限定结果
s++;//转换回1-7的表示方法
printf("%d\n", s);//输出结果
return 0;
}
例二,依照下面的公式计算,直到结果小于0或者大于100为止,f(0)由外部输入。
如果f(n)为奇数,f(n+1)=2f(n)
否则f(n+1) = f(n)/2-10
输出计算结果。
题目很清晰,直接输入并循环计算,直到符合退出条件为止。 对于条件的判断就是第一种情况的简单应用了。
代码如下:
#include stdio.h
int main()
{
int r;
scanf("%d",r);
while(r = 0 r = 100)//对结果进行范围判断
{
if(r 1) r *= 2; //奇数的情况。
else r=r/2-10;//偶数的情况。
}
printf("%d\n", r);
return 0;
}
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流