一、完整格式
% - 0 m.n l或h 格式字符
①%:表示格式说明的起始符号,不可缺少。
②-:有-表示左对齐输出,如省略表示右对齐输出。
③0:有0表示指定空位填0,如省略表示指定空位不填。
④m.n:m指域宽,若数据的位数小于m,则左端补空格,若大于m,则按实际位数输出。
n指精度,用于说明输出的实型数的小数位数。未指定n时,隐含的精度为n=6位。
⑤l或h:l对整型指long型,对实型指double型。h用于将整型的格式字符修正为short型。
二、格式字符
① d格式:用来输出十进制整数。有以下几种用法:
%d:按整型数据十进制的实际长度输出。
%md:m为指定的输出字段的宽度。如果数据的位数小于m,
则左端补以空格,若大于m,则按实际位数输出。
%ld:输出长整型数据。
② o格式:以无符号八进制形式输出整数。
%o:按整型数据八进制的实际长度输出。
%lo:对长整型可以用格式输出
%mo:指定字段宽度为m用格式输出
③ x格式:以无符号十六进制形式输出整数。
%x:按整型数据十六进制的实际长度输出。
%lx:对长整型可以用格式输出
%mx:指定字段宽度用格式输出
④ u格式:以无符号十进制形式输出整数。
%u:按无符号整型数据十进制的实际长度输出。
%lu:对长整型可以用格式输出
%mu:指定字段宽度用格式输出
⑤ c格式:输出一个字符。
⑥ s格式:用来输出一个串。有几中用法
%s:例如:printf("%s", "CHINA")输出"CHINA"字符串(不包括双引号)。
%ms:输出的字符串占m列,如字符串长度大于m,将字符串全部输出。
若串长小于m,则左补空格。
%-ms:如果串长小于m,则在m列范围内,字符串向左靠,右补空格。
%m.ns:输出占m列,但只取字符串中左端n个字符。
这n个字符输出在m列的右侧,左补空格。
%-m.ns:其中m、n含义同上,n个字符输出在m列范围的左侧,右补空格。
如果n>m,则自动取n值,即保证n个字符正常输出。
⑦ f格式:用来输出实数(包括单、双精度),以小数形式输出。有以下几种用法:
%f:不指定宽度,整数部分全部输出并输出6位小数。
%m.nf:输出共占m列,其中有n位小数,如数值宽度小于m左端补空格。
%-m.nf:输出共占n列,其中有n位小数,如数值宽度小于m右端补空格。
⑧ e格式:以指数形式输出实数。可用以下形式:
%e:数字部分(又称尾数)输出6位小数,指数部分占5位或4位。
%m.ne和%-m.ne:m、n和”-”字符含义与前相同。
此处n指数据的数字部分的小数位数,m表示整个输出数据所占的宽度。
⑨ p格式:输出指针地址
三、实例
如果想输出字符"%",则应该在“格式控制”字符串中用连续两个%表示,如:
printf("%f%%", 1.0/3);
输出0.333333%。
对于m.n的格式还可以用如下方法表示
char ch[20];
printf("%*.*s\n",m,n,ch);
前边的*定义的是总的宽度,后边的定义的是输出的个数。分别对应外面的参数m和n 。
这种方法的好处是可以在语句之外对参数m和n赋值,从而控制输出格式。
如何用printf 实现可变的域宽度? 就是说,我想在运行时确定宽度而不是使用 %8d
使用 printf("%*d", width, x)
格式说明符中星号表示,参数列表中的一个int值用来表示域的宽度。
########### printf 是 右(先)入栈 ########### #include <stdio.h> #include <stdlib.h> #include <stdint.h> int main() { uint64_t a = 0x0000000100000002; int rc = -5; printf("%llu leon %d\n", a, rc); //out: 4294967298 leon -5 printf("%d leon %d\n", a, rc); //out: 2 leon 1 printf("%d again %d %d\n", a,rc); //out: 2 again 1 -5 uint32_t b ; memcpy(&b, &a, sizeof(uint32_t)); printf("%d kjfsfljs\n", b); //out: 2 kjfsfljs (说明是小端) return 0; }
printf函数详细讲解
(1)简介:
printf函数是c语言当中非常重要的格式化输出函数
其函数原型为:int printf(const char *format, ...);
其函数返回值:打印出的字符格式
其调用格式为:printf("<格式化字符串>", <参量表>);
(2)转换说明:
转换格式为:%[标志][宽度][.精度][类型长度]类型
除了最后的类型之外都是可选的字段
标志 | 意义 |
- | 项目是左对齐的;也就是说,会把项目打印在字段的左侧开始处。示例:"%-20s" |
+ | 有符号的值若为正,则显示带加号的符号;若为负,则带减号的符号。示例:"%+6.2f" |
(空格) | 带符号的值若为正,则显示时带前导空格(但是不显示符号);若为负,则带减号符号。+标志会覆盖空格标志;示例:"% 6.2f" |
# | 使用转换说明的可选形式。若为%o格式,则以0开始;若为%x或%X格式,则以0x或0X开始。对于所有的浮点形式,#保证了即使不跟任何数字,也打印一个小数点符号。对于%g和%G格式,它防止尾随0被删除;示例:"%#o" |
0 | 对于所有的数字格式,用前导0而不是用空格填充字段。如果出现-标志或者指定了精度(对于整数)则忽略该标志;示例:"%010d" |
修饰符 | 意义 |
digit(s) | 字段宽度的最小。如果该字段不能容纳要打印的数或者字符串,系统就会使用更宽的字段。示例:"%4d" |
.digit(s) | 精度,对于%e,%E和%f转换,是将要在小数点的右边打印的数字的位数。对于%g和%G转换,是有效数字的最大位数。对于%s转换,是将要打印的字符的最大数目。对于整数转换,是将要打印的数字的最小位数;如果必要,要使用前导0来达到这个位数。只使用"."表示其后跟随一个零,所以%.f和%.0f相同;示例:"%5.2f"打印一个浮点数,他的字段宽度为5个字符,小数点后面有两位数字 |
修饰符 | 意义 |
h | 和整数转换说明符一起使用,表示一个short int或unsigned short int类型数值;示例:"%hu" "%hd" "%hx" |
hh | 和整数转换说明符一起使用,表示一个signed char或unsigned char类型数值;示例:"%hhu" "%hhd" "%hhx" |
j | 和整数转换说明符一起使用,表示一个intmax_t或uintmax_t值;示例:"%jd" "%jX" |
l | 和整数转换说明符一起使用,表示一个long int或unsigned long int类型数值;示例:"%lu" "%ld" |
ll | 和整数转换说明符一起使用,表示一个long long int或unsigned long long int类型数值(c99);示例:"%llu" "%lld" |
L | 和浮点转换说明符一起使用,表示一个long double值;示例:"%Lf" "%Le" |
t | 和整数转换说明符一起使用,表示一个ptrdiff_t值(与两个指针之间的差对应的类型)(c99);示例:"%td" |
z | 和整数转换说明符一起使用,表示一个size_t值(sizeof返回类型)(c99);示例:"%zd" |
I64 | 和整数转换说明符一起使用,表示一个_int64值 |
转换说明 | 输出 |
%a | 浮点数、十六进制数字和p-计数法(c99) |
%A | 浮点数、十六进制数字和P-计数法(c99) |
%c | 一个字符 |
%d | 有符号十进制整数 |
%e | 浮点数、e-记数法 |
%E | 浮点数、E-计数法 |
%f | 浮点数、十进制记数法 |
%g | 根据数值不同自动选择%f或%e。%e格式在指数小于-4或者大于精度时使用 |
%G | 根据数值不同自动选择%f或%E。%E格式在指数小于-4或者大于精度时使用 |
%i | 有符号十进制整数(与%d相同) |
%o | 有符号八进制整数 |
%p | 指针 |
%s | 字符串 |
%u | 无符号十进制整数 |
%x | 使用十六进制数0x的无符号十六进制整数 |
%X | 使用十六进制数字0X的无符号十六进制证书 |
%% | 打印一个百分号 |
(3)示例:
(4)浮点参数的转换:
有用于打印浮点类型double和long double的转换说明符,但没有用于float的说明符。原因是在K&R C中float值在被用于表达式中或者被用作参数之前,会被自动转换成double类型。一般情况下,ANSI C不会自动把float转换成double。不过,为了保护大量现有的假设float参数仍会自动被转换成double。因此,不过是K&R C还是ANSI C,都无需专门的转换说明符来显示float。
c++输出精度控制
题目描述:
数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和。
输入描述:
输入数据有多组,每组占一行,由两个整数n(n < 10000)和m(m < 1000)组成,n和m的含义如前所述。
输出描述:
对于每组输入数据,输出该数列的和,每个测试实例占一行,要求精度保留2位小数。
这里涉及到一个输出精度的控制,我们知道在这C语言中,控制输出精度可以直接用以下代码。
printf("%.2lf\n",sum);
在C++中输出控制精度需要用到std::ios_base::precison,即std::cout.precison()。这个函数是用来控制输出的有效位,如下所示
double n = 0.001010; cout.precision(4); cout << n << endl;
这个的输出结果就是0.00101。从第一个1开始为第一个有效位,连续输出4个有效位,最后一位的0被省略。这并没有达到我们要设置小数点后位数的要求,所以在查阅了资料后发现结合std::fixed使用可以控制小数点后的位数,使用方法如下:
double n = 0.001010; cout.precision(4); cout << fixed << n << endl;
这个的输出结果就是0.0010。
需要注意的是 cout.precision(4); 后cout的精度一直都是4个有效位,若设置了fixed,就一直控制小数点后的位数。目前还没有消除precision的方法,只能重新设置成新的有效位,但是针对fixed可是通过cout.unsetf( ios::fixed );来消除。
若定义float a;现要从键盘输入a数据,其整数位为3位,小数位为2位,则选用( A) A)scanf(“%6f”,&a); B)scanf(“%5.2f”,a); C)scanf(“%6.2f”,&a); D)scanf(“%f”,a); 为什么不是scanf("%3.2f",&a); 例子 #include<stdio.h> #include<stdlib.h>int main(){int k;float f;scanf("%3d%*4d%6f",&k,&f);printf("%d%f",k,f); return 0;} 原来scanf不能对精度进行控制,在scanf中的%6f表示读取一个长度为6位(含小数点)的浮点型数据。 (3) scanf()函数中没有精度控制。 如: scanf("%5.2f",&a); 是非法的。不能企图用此语句输入小数为2位的实数。 所以可以得出结论:scanf和printf对数据长度的控制不同,scanf不能控制精度只能控制长度,printf可以控制长度也可以控制精度。 然后又发现了一样东西: %*d4表示忽略一个4位的整数 于是又写了两个demo测试了一下 1.忽略前五位 #include<stdio.h>#include<stdlib.h> int main(){ int k; scanf("%*5d%d",&k);printf("%d",k); return 0; } 输入了123456后,输出结果为6 2.忽略后五位 #include<stdio.h>#include<stdlib.h> int main(){ int k; scanf("%1d%*5d",&k);printf("%d",k); return 0; } 输入了123456后,输出结果为1 当scanf正确读入时,返回值是和读取的变量数目相等的,也就是读取了几个数就返回多少,而当读取出错、读到文件末尾时,scanf函数会返回-1
有效数字 从一个数的左边第一个非0数字起,到末位数字止,所有的数字都是这个数的有效数字。 就是一个数从左边第一个不为0的数字数起到末尾数字为止,所有的数字(包括0,科学计数法不计10的N次方),称为有效数字。
简单的说,把一个数字前面的0都去掉,从第一个正整数到精确的数位止所有的都是有效数字了。 如:0.0109,前面两个0不是有效数字,后面的109均为有效数字(注意,中间的0也算)。 3.109*10^5(3.109乘以10的5次方)中,3 1 0 9均为有效数字,后面的10的5次方不是有效数字。 5.2*10^6,只有5和2是有效数字。 0.0230,前面的两个0不是有效数字,后面的230均为有效数字(后面的0也算)。 1.20 有3个有效数字。 1100.120 有7位有效数字。 2.998*10^4(2.998乘以10的4次方)中,保留3个有效数字为3.00*10^4。 对数的有效数字为小数点后的全部数字,如log x=1.23有效数字为2.3,log a=2.045有效数字为0、4.5,pH=2.35有效数字为3.5。 整体遵循“四舍五入”的方法