C语言中%d以及其他格式字符的常用小知识

在C语言中我们使用printf()语句打印时,可能会出现一些关于‘%’的问题。
PS:一定要看到最后!
格式说明由“%”和格式字符组成,如%d%f等。它的作用是将输出的数据转换为指定的格式输出。格式说明总是由“%”字符开始的。不同类型的数据用不同的格式字符。

%d 和 %u 的区别

%u 表示按unsigned int(无符号整形)格式输入或输出数据。
%d 有符号10进制整型输入或输出数据。
%ld 长整型输出

%f 和 %lf的区别

注意scanf函数和printf函数是不同寻常的函数,因为它们都没有将函数的参数限制为固定数量。scanf函数和printf函数又可变长度的参数列表。当调用带可变长度参数列表的函数时,编译器会安排float参数自动转换成为double类型,其结果是printf函数无法区分float型和double型的参数。因此在printf函数调用中%f既可以表示float型又表示double型的参数。

另一方面,scanf函数是通过指针指向变量的。%f告诉scanf函数在所传地址位置上存储一个float型值,而%lf告诉scanf函数在所传地址位置上存储一个double型值。这里float和double的区别是非常重要的。如果给出了错误的转换说明,那么scanf函数将可能存储错误的字节数量

因此,当输入时必须使用 %lf 来确保数据被正确存储为了方便使用者,很多编译器默许了常见的错误,当使用 printf("%lf",a) 时,若a为 double 变量,编译器会自动把其修改为 %f 而LLVM会警告并推荐修改为 %f 。
printf() 函数中不存在 %lf ,输入 double 用 %lf 输出用 %f

由于精度的原因,输出%lf和%f的数据不同,可能会造成错误。
主要有一下四点区别:
1、代表的数据类型不同
%f代表单精度浮点型数据(float),%lf代表双精度浮点型数据(double)。
2、有效数字位数不同
单精度浮点数有效数字保证6位,部分7位,双精度浮点数有效数字保证15位,部分16位。
3、所能表示数的范围不同
单精度浮点的表示范围:-3.40E+38 ~ +3.40E+38,双精度浮点的表示范围:-1.79E+308 ~ +1.79E+308
4、在程序中处理速度不同
一般来说,CPU处理单精度浮点数的速度比处理双精度浮点数快。

%2f 和 %.2f的区别

%2f 说明有效位数为2位。
%.2f 说明精确到小数点后2位。同理%.1f是精确到小数点后一位
例如:
printf("%2f, %2f, %.2f",123.1, 123.123, 123.123);
在这里插入图片描述

其他 :
%i              有符号10进制整数

%o              以八进制数形式输出整数

%x 				无符号的16进制数字,并以小写abcdef表示

%X 				无符号的16进制数字,并以大写ABCDEF表示

%c				用来输出一个字符

%s				用来输出一个字符串

%E/e			以指数形式输出实数

%g				根据大小自动选f格式或e格式,且不输出无意义的零

延伸:
scanf(控制字符,地址列表)
格式字符的含义同printf函数,地址列表是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址。
如:scanf("%d%c%s",&a,&b,str);
还有一个使用vs编程的过程中常见的问题:
使用VS会出现’scanf’: This function or variable may be unsafe. Consider using scanf_s ins这种错误。
这是因为新版vc库添加的警告,因为微软认为scanf的使用存在安全隐患,因为C/C++中的字符串处理都是以\0为截止符的,如果搜索不到\0,容易出现字符串越界所有vc扩展的所谓安全标准库,都添加了一个参数用以指定字符串参数的长度,用以避免这种安全隐患。
想要在代码中使用’scanf’,
修改方法有三种:

1.项目属性—配置属性—C/C+±–预处理器—预处理 器定义中加入 _CRT_SECURE_NO_DEPRECATE
2.在代码的第一行加:
#pragmawarning(dasable:4996)
3.在文件顶部加入一行:
#define _CRT_SECURE_NO_WARNINGS

原创文章 11 获赞 20 访问量 355

猜你喜欢

转载自blog.csdn.net/weixin_46078890/article/details/106108455