sacnf_s()函数小记

之前一直搞不明白在Visual Stdio2013上为什么C程序的scanf()函数总会被报错,但是程序复制到其他编译器上又是正确的。所以在用vs编C程序时,一直机械地按照它提醒的用scanf_s()来替换scanf()函数,虽然不知道为什么,但也没有出现问题。知道今天,当我要读入一个字符串时,如下:

#include <stdio.h>
#include <string.h>
int main(void)
{
     char str[100];
     scanf_s("%s", str);
     printf("%d %s", strlen(str), str);
     return 0;
}

结果确输出:0

我第一反应就是scanf_s()函数和scanf()看来并不完全等同(这不是废话,至少在没出现问题前,我一直都是直接用scanf()的语法直接套在scanf_s()上的),所以我就搜索了一下,结果如下:This function is specific to Microsoft compilers. It is the same as scanf, except it does not cause buffer overload.  It takes the input in a text based console program and places it into a variable. –from here

原来它是微软的编译器专用的,如vc++,vs(vs在2013以后才支持),因为scanf()函数输入时不检查下标,如果输入的字符串长度大于声明的长度,可能就会写到其他内存中去,造成未知错误,而scanf_s()函数基于scanf()做了改进,输入字符串时会增加一个限定长度的参数,如上面代码可改为:scanf_s("%s", str, 100), 这样即使输入超限了,程序也只会读取前99个字符然后再加一个‘0’。

对自己说:出来混,总是要还的,避开不如拿开

时间: 2024-12-16 04:04:31

sacnf_s()函数小记的相关文章

jQuery中each函数小记

项目中自己在写一个很简单的表单验证的时候,需要遍历所有textarea并判断.因为用jQuery,所以第一反应就是用each函数遍历,当遍历到为空的textarea时,弹出提示并中断js的运行.一开始我是这样写的: 1 input.each(function(){ 2 if($(this).val() == null) 3 { 4 alert("test"); 5 return false; 6 } 7 //其他代码 8 }); 运行之后发现,弹窗会出现,但是之后的代码也运行了,而且遍

欧拉函数小记

稍微整理一下欧拉函数的相关内容. 定义 φ(n) 表示在[1,n]内,所有与n互质的数的个数. 通式: $φ(n) = n\prod\limits_{i=1}^k (1-\frac{1}{p_i}) $ 或者 $φ(n) = n\prod\limits_{i=1}^k (\frac{p_i-1}{p_i}) $ 其中: $n = p_1^{a_1}p_1^{a_2}...p_k^{a_k}$ 其中φ(1) = 1 特别的,当n是素数时,φ(n) = n-1 性质 1.欧拉函数是积性函数,即 $φ

CloseHandle()函数小记

最近看一段程序,在创建线程时是这样写的: ......HANDLE hThread = CreateThread(NULL,0,StartServProc,pServPara,0,&dwThreadId); CloseHandle(hThread);...... 有一个疑问:这不是刚创建完线程,又关闭了吗. 查找相关资料,终于弄清楚是怎么回事,记录在此. ***********************************************************************

Java的main函数使用小记

转自:http://blog.csdn.net/qdieyou/article/details/1490618 ———————————————————————————————— main函数的完整定义语法为public static void main(String[] args) main方法是个特殊的方法,它是主程序访问的入口点,可以使用public.默认(即什么都不写).protected.private进行修饰,并且不会出现运行期错误. 其中,public不是 必须的,声明为public

实习小记-python 内置函数__eq__函数引发的探索

乱写__eq__会发生啥?请看代码.. >>> class A: ... def __eq__(self, other): # 不论发生什么,只要有==做比较,就返回True ... return True ... >>> a = A() >>> b = A() >>> a == b True >>> a != b # 这个地方为什么会返回False? False >>> a > b Trac

JS常用函数用途小记

concat() 方法用于连接两个或多个数组. 该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本. var a = [1,2,3]; document.write(a.concat(4,5)); shift() 方法用于把数组的第一个元素从其中删除,并返回第一个元素的值. var arr = new Array(3) arr[0] = "George" arr[1] = "John" arr[2] = "Thomas" document

scanf函数用法小记

By francis_hao    Aug 26,2017 scanf – 输入格式转换 概述 #include <stdio.h>int scanf(const char *format, ...); 描述 该函数通过format扫描标准输入stdin, format包含转换描述说明,如果需要转换,那么转换后的结果存储在format之后的指针参数中,每个指针参数类型必须要正确对应转换说明.如果format中转换说明符的个数,超过了后面的指针参数,那么结果将是未定义的.反过来,如果指针参数的数

函数指针小记

与一般的数据一样,函数在内存中也占有一定空间,所以函数也有“地址”的概念,函数指针就是指向这个“地址”(即函数代码块的起始地址),函数指针的type就是函数本身.知道了地址,我们很轻松的就能靠函数指针来完成函数调用. 1.简单函数指针: 1void add(int a, int b){ //这里写了一个很简单的函数 2 cout << a + b << endl; 3 } 1 void (*p1)(int a, int b); //声明一个函数指针,指向的函数类型为“返回void,

日常小记:C++中的log10函数

今天有同学问我C++中有没有什么简单的办法可以求出两个数相加的和的位数,然后就有了如题的那种方法. log10(100)的返回值就是2,log(999)的返回值是二点几,不过如果你把返回值定位int型它就会自动转换成2了. #include<iostream> #include<cmath> using namespace std; int main(){ int a,b; while(cin>>a>>b){ a=log10(a+b)+1; cout<