更新时间:2024-10-11 09:30:34 浏览:100
printf函数应该是每个人学习C语言遇到的第一个函数,很简单,却又很复杂(因为它可以对所有的C基础数据类型进行打印),估计很多人到现在只用过printf函数极少的功能。本文对printf函数的用法做了简要总结,包括C99的相关内容。 在C语言中,printf()、fprintf()、sprintf()函数都向输出流中写入可变数量的数据项,并且利用格式串来控制输出的形式。注意,这几个函数除了写入的目的位置不同以外,其他都是相同的。printf()函数写入stdout,fprintf()函数写入写入第一个参数FILE *stream中,sprintf()写入字符串中,这里仅介绍printf()函数。
int printf ( const char * format, ... );
int fprintf(FILE *stream, const char *format, ...);
int sprintf ( char * str, const char * format, ... );
printf函数按照格式化串(format)的格式将入参中的其他可变参数打印到stdout。格式化串包含普通字符和转换说明符,其中转换说明符以%开头,如下所示,最多包含5部分,[]中括号中的内容都是可选的。
%[flags][width][.precision][length]specifier
下图是对转换说明符构成的一个概括的介绍,接下来先从最后一部分转换说明符specifier开始介绍
最后一部分的转换说明符是最重要的部分,也是必须指定的部分,其他前面4部分都是可选的。
对于实数,f和F是没有区别的,主要用来打印infinity(无穷,包括正负无穷)和NaN(not a number,非数字)进行区分。下面的例子,说明了C99中INF,NAN等的产生和打印。
#include <stdio.h>
#include <math.h>
int main(){
printf("%f and %f\n", INFINITY, nan("0")); //输出: inf and nan
printf("%F and %F\n", INFINITY, nan("0")); //输出: INF and NAN
printf("1.0/0.0 = %F \n",1.0/0.0 ); //输出: 1.0/0.0 = INF
printf("-1.0/0.0 = %F \n",-1.0/0.0 ); //输出: -1.0/0.0 = -INF
printf("0.0/0.0 = %F \n",0.0/0.0 ); //输出: 0.0/0.0 = NAN
return 0;
}
假设使用 %e 格式说明符,计算出该浮点数的指数。
需要注意的是,%g 的输出并不一定与 %f 或 %e 中较短的输出完全一致。它基于指数大小来选择格式,而不是单纯地比较长度。
#include <stdio.h>
int main() {
double num1 = 123456.0;
double num2 = 1234567.0;
printf("num1: %g\n", num1); // 输出: 123456,去除尾随零和小数点
printf("num2: %g\n", num2); // 输出: 1.23457e+06
return 0;
}
下面的例子,展示了a和A的表示方法,double和float都适用。
#include <stdio.h>
int main() {
double num = 3.14159;
printf("num in hexadecimal: %a\n", num); // 输出: num in hexadecimal: 0x1.921f9f01b866ep+1
printf("num in hexadecimal: %A\n", num); // 输出: num in hexadecimal: 0X1.921F9F01B866EP+1
double big_num = 666.666666;
printf("big_num in hexadecimal: %a\n", big_num); //输出:big_num in hexadecimal: 0x1.4d55554fbdad7p+9
float num_f = 3.14159;
printf("num_f in hexadecimal: %a\n", num_f);//输出: num_f in hexadecimal: 0x1.921fap+1
double num_neg = -3.14159;
printf("num_neg in hexadecimal: %a\n", num_neg);//输出: num_neg in hexadecimal: -0x1.921f9f01b866ep+1
double result = (1 + 0.5625 + 0.0078125 + 0.000244140625 + 0.0002288818359375 + 0.00000858306884765625 + 0.000000894069671630859375 + 0.0000000037252902984619140625 + 0.00000000256113708019256591796875 + 0.000000000116415321826934814453125 + 0.00000000000545597076416015625 + 0.00000000000034050690937042236328125 + 0.000000000000024868919445037841796875);
printf("result= %f, num= %f",result, result * 2);//输出: result= 1.570795, num= 3.141590
return 0;
}
那么0x1.921f9f01b866ep+1是如何表示3.14159的呢?其计算方法如下,小数点后的16的负次幂,小数点前的为16的正次幂,
上述计算的结果为1.570795,需要再乘以指数部分1.570795*2^(1)=3.141590。
printf ("Characters: %c %c \n", 'a', 65);//输出: Characters: a A
#include <stdio.h>
int main() {
int number = 42;
int *ptr = &number; // Store the memory address of 'number' in 'ptr'
printf("Value of 'number': %d\n", number);
printf("Memory address of 'number': %p\n", (void*)ptr);
return 0;
}
输出为,从输出可以看出64位的系统指针的长度为8字节。
Value of 'number': 42
Memory address of 'number': 0000007c9fbffcb4
#include <stdio.h>
int main() {
int count;
printf("Hello,world! %n", &count);
printf("count = %d\n", count); //输出:Hello,world! count = 13
return 0;
}
上述例子将字符串 "Hello, world! " 输出到控制台,并将已写入的字符数量 (13 个字符,包括空格符) 存储到 count 变量中。
#include <stdio.h>
int main() {
printf("%o\n", 10); //输出:12
printf("%#o\n", 10);//输出:012
printf("%x\n", 10);//输出:a
printf("%#x\n", 10);//输出:0xa
printf("%g\n", 1.0);//输出:1
printf("%#g\n", 1.0);//输出:1.000000
return 0;
}
如果打印的数据位数太少,无法达到这个宽度,那么printf()会进行填充(默认会在数据项的左侧添加空格,从而使其在栏内右对齐)。如果数据的位数太多,超过了这个宽度,则不会裁剪,也会正常的完整显示数据。最小字段宽度可以设置为一个整数,也可以用*号表示,*号的的意思是从printf()函数的入参去指定输出字段的宽度,而不是在格式化字符串中指定。
#include <stdio.h>
int main() {
int width = 10;
char string[] = "Hello";
printf("%*s\n", width, string); // 输出: " Hello"
return 0;
}
#include <stdio.h>
int main() {
printf("%.10d \n",10);//输出:0000000010
printf("%.0d\n", 0); // 不输出
return 0;
}
#include <stdio.h>
int main() {
printf("%.2s \n","hello");//输出:he
return 0;
}
长度修饰符搭配转换说明符,共同指定传入的实际参数的类型。
#include <stdio.h>
int main() {
size_t value = 1024;
printf("The value is: %zu\n", value);// 输出:The value is: 1024
return 0;
}