10.printf深入讨论
printf函数从参数中获取二进制数据,并将它根据转换规范转换成字符串,并打印在控制台上。本章分析其原理
1)
分析上图打印aBiggerNum错误所在
分析问题前先回忆知识点:整型在计算机中的存储为补码表示法。设一个十进制数为 n ,模为 mod 。若 n 为正数, n 的补码为 n 的 二进制。若 n 为负数,设 dec = mod - |n| , n 的补码为 dec 的二进制。
//原来如此 通过上面的分析,我们可以得出一个推论,只要数值的二进制中最高位为0,使用 %d 或 %u 都能得到正 确的转换结果。但是并不建议这么做,请严格使用类型对应的转换规范。
2)
unsigned long 和 unsigned long long 均为比 unsigned int 高级的类型,因此它们进入printf函数的时 候仍然保持有类型。但是转换规范 %u 或 %d ,它们仅仅取了int或unsigned int类型的大小,也就是4个 字节进行转换。
由于 unsigned long 在Visual Studio中也是4个字节,所以结果正确。而 unsigned long long 在Visual Studio中为8个字节,因此数据被截断了一半。
解决方法:
3)
值得注意的是,长度指示符 h hh 是通过先获取原有长度的数据,再丢弃一部分数据。从而达到缩短转 换数据长度的。
听课重点:
-如何将二进制数据转换成字符串
-如何根据转换规范获取二进制数据
11.快速学会scanf函数
1)错误C4996
解决办法:alt+enter打开属性面板
预处理器定义中加入(不是更改为) _CRT_SECURE_NO_WARNINGS
2)使用公式
-scanf是一个变参函数。
-scanf的第一个参数是字符串。
- scanf的第一个参数内容为匹配字符以及转换规范。
- scanf的后续参数,是转换完成后,数据的存放位置。
- 转换规范的写法与数量,需要与后续的参数类型和数量对应。
如果scanf将转换后的二进制存储到基本变量当中,请在变量名前加&。 如果scanf将字符串存储到字符数组中,字符数组名不用加&。
回顾一下
3)scanf常见错误
-长度正确但类型错误
-输入字符串数值大于转换类型取值范围
-变量放不下转换结果
使用scanf的时候请注意,输入字符串的数值与转换规范和接收转换结果的变量类型必须匹配才能得到 正确结果。
4)输入字符/字符串
字符
如果要给char类型输入数值,请使用转换规范 hhd 。若还是使用转换规范 c 。会将第一个字符的ASCII 码装入变量。
输入字符串
听课重点
-scanf函数使用公式
-如何将字符串转换对应值
-几个常见的scanf错误
资料来源@你好编程