C语言基础 scanf详解

文章详细解释了scanf函数的工作原理,内存安全问题,特别是scanf_s与scanf的区别,以及在处理不同格式输入时的细节。涉及整型、字符输入、内存溢出和字节顺序等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

输入字符串

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之间什么都没有),那么通过标准输入设备(键盘)输入时两个整型之间可以空格或者回车

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值