输入字符串
char szBuf[20] = {0}; 一个以零为结尾的缓存
sacnf("%19[0-9]s",szBuf);
不设置长度会内存越界 %和s中间加一个长度限制即可控制输入的长度范围
无论你输入多少,系统只会读十九位
[0-9]限制只能输入0到9,系统读取到其他字段为截断
[0,1,2,4]只能输入0 1 2 4
[^8]不能输入8
输入整型
int n; 该n为上次程序使用n的值,因没有清除内存,但一般不用清除,此时n是一个残留值。
此时应初始化变量
int n = 0;
常见隐患操作
scanf("%d",n); 格式化输入参数到指定地址 %d格式化参数 n为指定地址
n是一个值,但scanf将其作为地址,则地址代表的数字则是n的数组,然后将参数赋值给和n数字相同的地址处开始 ,因为没有加入&地址符
此时n被重新赋值,若n地址不存在(由于是上次程序的残留值,会内存报错)
C0000005报错:内存访问异常:如没有权限,错误访问地址
若存在地址,可通过查找n的地址,在其地址重新赋值达到正常scanf作用
short int ary[2] = {666, 999};
scanf("%hd",ary); 数组名表数组首地址 ary == &ary[0]
短整型占位符为hd
int n = 0x19ff2c;
int m = 0;
scanf("%d",n); 输入999
n作为地址,找到n0x19ff2c的位置,绿色首个0就是19ff2c的位置作为首地址开始填充数据
绿色前的2cff1900是n的位置表示n这个内存数据,紧跟其后的便是n的内存位置
此时绿色位置填充m的值999 十六进制3E7,这是小端字节序
printf("%08x\r\n",n); 0019ff2c
%08x
是一个格式化输出指示符,用于表示以十六进制格式输出的整数。也可作为输出地址使用
0表示填充位数字,8表示输出的位数
输入的整数转化为十六进制数,但此数至少有八位,没有占满位置则向左用0填充
如100 -> 00000064
printf("%08x\r\n",m); 000003e7
scanf和scanf_s的区别
int main()
{
char a = 0;
scanf_s("%c", &a, 1);
return 0;
}
scanf_s有三个参数格式分别是参数部分,地址部分和变量所占据空间的大小(单位为字节)
如上述程序最后一个参数可以写1,也可以写sizeof(a)。
( scanf_s("%c", &a, sizeof(a));)
如果a为整型的话,第三个参数就为4,或者sizeof(a)。
如果输入整型数据,scanf函数的里面的sizeof()是在所有取地址的后面,而输入字符,每个取地址后面需要有一个sizeof()
scanf_s("%d %d", &a, &b, sizeof(a),sizeof(b));
scanf_s("%c %c", &a, sizeof(a), &b, sizeof(b));
scanf_s输入的相关细节
如%d %d(%d%d之间有空格),那么通过标准输入设备(键盘)输入时两个整型之间也加一个空格。
如%d,%d(%d%d之间逗号),那么通过标准输入设备(键盘)输入时两个整型之间也加一个逗号。
如%d%d(%d%d之间什么都没有),那么通过标准输入设备(键盘)输入时两个整型之间可以空格或者回车