查看: 385|回复: 0

C语言中的格式化

[复制链接]

237

主题

314

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
21620
发表于 2022-12-14 00:02:42 | 显示全部楼层 |阅读模式

1. 基本格式化输出符号
符号        含义
%c        字符
%d        十进制整数
%e        浮点数,指数e的形式
%s        字符串
%E        浮点数,指数E的形式
%u        无符号十进制整数
%f        浮点数,小数点形式
%g        输出%f与%e较短者
%o        无符号八进制整数
%G        输出%F与%E较短者
%x        无符号十六进制整数,以0~f表示
%X        无符号十六进制整数,以0~F表示
%l        长整型,加在d,o,u,x,X之前,如%ld(注意%l是英文字母l,不是数字1)
1.1 %g详解
当一个数字的绝对值很小的时候,要表示这个数字所需要的字符数目就会多到让人难以接受。举例而言,如果我们把 π*10^-10 写作 0.00000000000314159 就会显得非常丑陋不雅,反之,如果我们写作 3.14159e-10,就不但简洁而且易读好懂。


当指数是 -4 时,这两种表现形式大小相同。对于比较小的数值,除非该数的指数小于或者等于-5,%g 才会采用科学技术发来表示,即,以 %e 的格式进行输出。


示例程序:
[C++] 纯文本查看 复制代码
printf("%g\n", 0.00031415926235);
0.000314159
printf("%g\n", 0.000000031415926235);
3.14159e-008

2. printf函数解析

函数原型:

[C++] 纯文本查看 复制代码
int printf(const char *format,[argument]);

format 参数输出的格式,定义格式为:

[C++] 纯文本查看 复制代码
%[flags][width][.perc] [F|N|h|l]type



2.1 type 含义如下:
符号        含义
d        有符号10进制整数
i        有符号10进制整数
o        有符号8进制整数
u        无符号10进制整数
x        无符号的16进制数字,并以小写abcdef表示
X        无符号的16进制数字,并以大写ABCDEF表示
F        /f 浮点数
E        /e 用科学表示格式的浮点数
g        如果数据长度较小,用 %f 表示,如果较大,用 %e 表示
c        单个字符
s        字符串
%        显示百分号本身
p        显示一个指针,near指针表示为:XXXX ;far 指针表示为:XXXX:YYYY
n        相连参量应是一个指针,其中存放已写字符的个数
2.1.1 %n 详解
[C++] 纯文本查看 复制代码
#include "stdio.h"
int main(int argc,char *argv[])
{
    char a[20];
    int x,t;
    double y;
    scanf("%s%n",a,&t);//把接收的字符个数赋给t
    printf("%s-->You have just entered %d character(s).\n",a,t);
    scanf("%d%n",&x,&t);//把接收整型数的字符个数赋给t
    printf("%d-->You have just entered %d character(s).\n",x,t);
    scanf("%lf%n",&y,&t);//把接收浮点数的字符个数赋给t
    printf("%g-->You have just entered %d character(s).\n",y,t);
    return 0;
}

[C++] 纯文本查看 复制代码
lh@ubuntu:~/libingxuan$ ./a.out
    1234   //这里是4个空格接着1234\n,scanf会统计先导的空白符号,但是不会写入文件,所以这里是8个
1234-->You have just entered 8 character(s).
123       //此时缓冲区的状态是\n1234\n
123-->You have just entered 4 character(s).
1.314
1.314-->You have just entered 6 character(s).

在printf中的用法与上述类似
[C++] 纯文本查看 复制代码
#include <stdio.h>

int main()
{
    int x;printf("\n\n\n\n12345%n\n",&x);
    printf("%d\n",x);
}

2.2 flags 规定输出格式,取值和含义如下:

符号        含义
无        右对齐,左边填充空格
-        左对齐,右边填充空格
+        在数字前增加符号 + 或 -
#        主要针对8进制、16进制的输出,type=o,x,X时,分别在数值前增加’0’,“0x”,“0X”
0n(n=1,2,3…)        宽度至少为 n 位,不够左边以 0 填充 * 格式列表中
2.3 width
width 表示宽度,宽度不够的会以空格填充 ,超出限定长处的部分不会显示

2.4 prec 用于控制小数点后面的位数,取值和含义如下:
符号        含义
无        按缺省精度显示
0        不显示小数点
n(n=1,2,3…)        表示要保留小数位数
2.5 [F|N|h|l] 表示指针是否是远指针或整数是否是长整数
F 远指针
n 近指针
h短整数或单精度浮点数
l 长整数或双精度浮点数

2.5.1 近指针、远指针解释
近指针、远指针、巨指针是段寻址的 16 bit 处理器的产物(如果处理器是 16 位 的,但是不采用段寻址的话,也不存在近指针、远指针、巨指针的概念),当前普通PC所使用的 32 bit 处理器(80386以上)一般运行在保护模式下的,指针都是 32 位 的,可平滑地址,已经不分远、近指针了。




%s 是接受字符串


%c 是接受所有类型的单个字符
[C++] 纯文本查看 复制代码
char a;
char b[20];
scanf("%c",&a);//只能输入一个字符;
sanf("%s",b);//可以输入一串不超过20字符的字符串,**这里不能有&符号**

这里不能有&符号!
%c 对应类型为char, %s对应类型为char * , 即字符串.
%s 本身会跳过空白符,并且不检查长度,实际上是遇到空白符就停止


但是%c不会跳过,甚至回车键都会被接受,有时会造成程序无法输入直接结束的现象,其实就是%c接受了回车键


%d 输出一个整型数
[C++] 纯文本查看 复制代码
printf("%d",a)

%d\n 输出整型并换行
[C++] 纯文本查看 复制代码
printf("%d\n",a)




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表