printf、sprintf、snprintf、fprintf

原文网址:printf、sprintf、snprintf、fprintf_IT利刃出鞘的博客-CSDN博客​​​​​​​

简介

xxxprintf函数都是处理字符串的,也就是说,参数必须以'\0'结尾。操作结束后,写入到的文件/buffer都会自动添加上'\0'。

printf

    主要功能:打印字符串
    函数原型:int printf(const char *format, ...);
    format的格式:% [flags] [width] [.prec] [F|N|h|l] type

type
 

type

对应数据类型

含义

d/i

int

有符号的10进制整数,i是老式写法。(正数不输出符号)

ld

long

有符号10进制长整形

u

unsigned int

无符号10进制整数

lu

long unsigned int

无符号10进制长整型或unsignedlong

llu

long long unsigned int

64位的无符号10进制长长整型。若系统是32位,则用此会出错。

o

unsigned int

无符号8进制整数(不输出前缀o)

x/X

unsigned int

无符号16进制整数,x对应的是abcdef,

//X对应的是ABCDEF(不输出前缀0x)

lx

long unsigned int

无符号16进制长整型

llx

long long unsigned int

64位的无符号16进制长长整型。若系统是32位,则用此会出错。

f(lf)

float(double)

单精度浮点数用f,双精度浮点数用lf(尤其scanf不能混用)

e/E

double

科学计数法表示的数,"e"的大小写代表在输出时用的“e”的大小写

g/G

double

以%f或%e/%E中较短的输出宽度输出,且不输出无意义的0.

c

char

字符型。可以把输入的数字按誄II码相应转换为对应的字符

s/S

char*/wchar_t*

字符串。输出字符串中的字符直至字符串中的空字符

//(字符串以'\0‘结尾,这个'\0'即空字符)

p

void*

以16进制形式输出指针

n

int*

到此字符之前为止,一共输出的字符个数,不输出文本

%

无输入

不进行转换,输出字符‘%’(百分号)本身

m

打印errno值对应的出错内容,(例:printf("%m\n");)

flags

flag

字符名称

说明

-

减号  

左对齐,右边填充空格(默认右对齐)。  例:%-7d 表示输出7位整数左对齐,右边补空格      

+

加号   

在数字前增加符号 + 或 -                                                            

0

数字零

        

输出的前面补上0,直到占满指定列宽为止(不可以搭配使用“-”)                

例:printf("%02d", i)                                                                             

空格

输出值为正时加上空格,为负时加上负号                                     

#

井号  

type                       结果

c、s、d、u:        无影响;
o:                        在输出时加前缀o;
x:                        在输出时加前缀0x;

X:                        在输出时加前缀0X;
e、g、f:              当结果有小数时才给出小数点。

例:printf("%#x", i)                                                   

width

        用十进制整数来表示输出的最少位数。
        若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0(通过flags控制)。

prec

        精度格式符以“.”开头,后跟十进制整数。如果没有给出精度,按 0(零)对待。
        如果输出数字,则表示小数的位数;如果输出的是字符,则表示输出字符的个数;若实际位数大于所定义的精度数,则截去超过的部分。
        prec没指定时:d,i,o,u,x时:没有影响;e,E,f时:不显示小数点
     d、o、i、 u、x 或 X  :  转换的最少数字显示位数。
     e、E或 f :                       转换的基数字符后的最少数字显示位数。对于f,是小数位数。
     g :                                    转换的最大有效数字位数。
     s :                                    转换中字符串的最大打印字节数目。

%*.*

“*”*在“.”以前:对于输入
输入时:用以表示该输入项,读入后不赋予相应的变量,即跳过该输入值
scanf("%*d %*d %d", &n);
如果输入2004 2005 2006
那么n=2006

对于输出

“*”*在“.”之前:用户输入一个位宽值来代替,表示输出的字符所占位宽。
“*”*在“.”之后:表示输出位数,具体的数据来自参数表。printf格式字符串中,与宽度控制和精度控制有关的常量都可以换成变量,
如果没有.,则默认*在.之后。
例1
printf("%*s",5,"123");
输出结果:##123
(#代表一个空格)  相当于5代替了*
例2
char *s = "this is test example";
int a = 15, b = 10;
printf("%*.*s\n", a, b, s);
输出结果:#####this is te
(#代表一个空格)

F|N|h|l
表示指针是否是远指针或整数是否是长整数
F 远指针
N 近指针
h 短整数(short int)
l 长整数(long int) (此处如果与d搭配为%lld则为long long int(C99),与f搭配为%llf则为long double(C99))
[Argument]
        包含需要输出的数据,可以是常量(字符常量、数字常量、字符串常量),变量,以及运算式。此处的数据应当与前面的format中的格式控制符一一对应(如果不对应会产生错误)。

printf技巧

\b

printf的\b可以将光标回退一个字节。(backspace)
例1
printf("1234");
printf("\b56");
输出的结果为:12356  (5将4覆盖)

例2
在同一位置打印数字方法
int i = 0;
printf("%02u%%", i);
for(i = 0; i < 100; i++){
  printf(    "\b\b\b"
                "   "
                "\b\b\b"
                "%02u%%", i);
}

不能立即输出

有时print不能立即输出原因
    unix上标准输入输出都是带有缓存的,一般是行缓存。对于标准输出,需要输出的数据并不是直接输出到终端上,而是首先缓存到某个地方,当遇到行刷新标志或者该缓存已满的情况下,才会把缓存的数据显示到终端设备上。
    ANSI C中定义换行符'\n'可以认为是行刷新标志。所以,printf函数没有带'\n'是不会自动刷新输出流,直至缓存被填满。
解决方法
1、在printf里加"\n"
2、fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上 。
3、setvbuf(stdout,NULL,_IONBF,0); //如果你嫌上个方法麻烦, 就使用这个函数. 直接将缓冲区禁止了. 它就直接输出了

百分数进度

static void print_process_start(float val)
{

    float tmp = 0.0;
    tmp = val * 100;
    printf("%05.2f%%", tmp );
}

static void print_process(float val)
{
    float tmp = 0.0;
    tmp = val * 100;
    printf(    "\b\b\b\b\b\b"
            "      "
            "\b\b\b\b\b\b"
            "%05.2f%%", tmp);
}

打印结果:
00.00% => 12.34% => ...

unsigned long long

int main() 
{
        unsigned long long ull = 0x123456789;
        unsigned int tmp;
        printf("#x                               : %#x\n", ull);
        printf("#llx                             : %#llx\n", ull);
        tmp = (unsigned int)(ull >> 32);
        printf("H                                : %#x\n", tmp);
        tmp = (unsigned int)(ull & 0xffffffff);
        printf("L                                : %#x\n", tmp);
        printf("(unsigned int)(ull >> 32)        : %#x\n", (unsigned int)(ull >> 32));
        printf("(unsigned int)(ull & 0xffffffff) : %#x\n", (unsigned int)(ull & 0xffffffff));
        printf("(unsigned int)(ull << 32)        : %#x\n", (unsigned int)(ull << 32));
        return 0;
}

用gcc -m32 -o test test.c和gcc -o test test.c编译后,执行./test,结果是:
#x                                               : 0x23456789
#llx                                             : 0x123456789
H                                                : 0x1
L                                                 : 0x23456789
(unsigned int)(ull >> 32)         : 0x1
(unsigned int)(ull & 0xffffffff) : 0x23456789
(unsigned int)(ull << 32)         : 0

sprintf

其他网址:sprintf的使用 - CSDN博客

主要功能:把格式化的数据写入某个字符串中
函数原型:int sprintf(char *str, const char *format, ...);
    str:       将要写入的字符串指针
    format:格式化字符串
    ...         :可选参数,可以是任意类型的数据。对应format里边
返回值
        成功:返回写入buffer 的字符数,结束字符‘\0’不计入内
        出错:返回-1. 如果 buffer 或 format 是空指针,函数将返回-1,并且 errno 会被设置为 EINVAL。

示例

        char buf[10];
        char *str = "hello";
        int a = 10
        sprintf(buf, "%s%d", str, a)
        则buf内容为:"hello10"

snprintf

主要功能:把格式化的数据写入某个字符串中
函数原型:int snprintf(char *str, size_t size,const char *format, ...);
    str:       将要写入的字符串指针
    size:     
    format:格式化字符串
    ...         :可选参数,可以是任意类型的数据。对应format里边
返回值
    成功:返回想要写入的字符串长度
    出错:返回负值。
  (1) 若格式化后的字符串长度 < size,则将此字符串全部复制到str中,并给其后添加一个字符串结束符('\0');
  (2) 如果格式化后的字符串长度 >= size,则只将其中的(size-1)个字符复制到str中,并给其后添加一个字符串        结束符('\0'),返回值为欲写入的字符串长度。

fprintf


主要功能:格式化输出到一个流/文件中
函数原型:int fprintf(FILE *stream, const char *format, ...);
      stream:文件指针 (stdin,stdout,stderr为标准输入、输出、错误,可以直接使用)。或者
                    stream = fopen("test.txt","r+");
      format:格式化字符串
       ...         :可选参数,可以是任意类型的数据。对应format里边
返回值
    成功:输出的字符数
    失败:负值

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT利刃出鞘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值