print输出控制


一、完整格式

%   - 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)示例:

 1     #include <stdio.h>
 2 
 3     int main() {
 4     const char * pString = "Hello World";
 5     const int    nNumber = 1024;
 6     const double dNumber = 3.141593;
 7     //  %d  示例
 8     printf("*%d*\n", nNumber);          //输出:*1024*
 9     printf("*%6d*\n", nNumber);         //输出:*  1024*
10     printf("*%6.5d*\n", nNumber);       //输出:* 01024*
11     printf("*%-6.5d*\n", nNumber);      //输出:*01024 *
12     printf("*%06d*\n", nNumber);        //输出:*001024*
13     printf("*%+6d*\n", nNumber);        //输出:* +1024*
14 
15     //  %f  示例
16     printf("*%f*\n", dNumber);          //输出:*3.141593*
17     printf("*%10f*\n", dNumber);        //输出:*  3.141593*
18     printf("*%10.2f*\n", dNumber);      //输出:*      3.14*
19     printf("*%-10.2f*\n", dNumber);     //输出:*3.14      *
20     printf("*%+10.2f*\n", dNumber);     //输出:*     +3.14*
21     printf("*%010.2f*\n", dNumber);     //输出:*0000003.14*
22 
23     //  %s  示例
24     printf("*%s*\n", pString);          //输出:*Hello World*
25     printf("*%20s*\n", pString);        //输出:*         Hello World*
26     printf("*%-20s*\n", pString);       //输出:*Hello World         *
27     printf("*%.10s*\n", pString);       //输出:*Hello Worl*
28     return 0;
29 }

 

 

(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^53.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^42.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
。 整体遵循“四舍五入”的方法

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM