C语言基础 scanf详解

scanf详解

输入字符串

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

你可能感兴趣的:(c语言,数据结构,开发语言)