当前位置:   article > 正文

超详解c语言printf(0基础也能看懂)

c语言printf

前言:什么是printf

在百度百科中是这样形容printf的:printf 是指格式化输出函数,主要功能是向标准输出设备按规定格式输出信息。printf 是C语言标准库函数,定义于头文件 <stdio.h>。printf 函数的一般调用格式为:printf(“<格式化字符串>”, <参量表>) 。输出的字符串除了可以是字母、数字、空格和一些数字符号以外,还可以使用一些转义字符表示特殊的含义 ,那么我就简单介绍一下printf这个库函数。

提示:以下是本篇文章正文内容,下面案例可供参考

一、printf是格式输出库函数

如标题所见printf是一个格式输出库函数,因为它是库函数所以它有一个头文件,这个头文件是***<stdio.h>***
在使用时一定要引用这个头文件。printf() 的作⽤是将参数⽂本输出到屏幕。它名字⾥⾯的 f 代表 format (格式化),表⽰可以定制输出⽂本的格式。printf是不会在末尾加换行符号(\n)的,这一点和python不一样,需要我们的需求来添加换行符(\n)如下面的代码便能看出差别

#include <stdio.h>
int main ()
{
printf ("Hello,World!");
printf ("Hello,World!");
printf ("Hello,World!\n");
printf ("Hello,World!\n");
return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

这段代码的输出格式如下

可以明显看出差别,但是因为printf是不会在末尾加换行符号(\n)的所以第一行有三个Hello,World不必感到惊奇,因为printf是格式输出函数所以下面便将介绍printf的格式化的表现。

二:输出格式化

格式符

格式输出化的关键之一是格式符(说明符(specifier)用于规定输出数据的类型)在c语言中有许多的格式符下面便是一些常见的格式符
• %a :⼗六进制浮点数,字⺟输出为⼩写。
• %A :⼗六进制浮点数,字⺟输出为⼤写。
• %c :字符。
• %d :⼗进制整数。
• %e :使⽤科学计数法的浮点数,指数部分的 e 为⼩写。
• %E :使⽤科学计数法的浮点数,指数部分的 E 为⼤写。
• %i :整数,基本等同于 %d 。
• %f :⼩数(包含 float 类型和 double 类型)。
• %g :6个有效数字的浮点数。整数部分⼀旦超过6位,就会⾃动转为科学计数法,指数部分的 e
为⼩写。
• %G :等同于 %g ,唯⼀的区别是指数部分的 E 为⼤写。
• %hd :⼗进制 short int 类型。
• %ho :⼋进制 short int 类型。
• %hx :⼗六进制 short int 类型。
• %hu :unsigned short int 类型。
• %ld :⼗进制 long int 类型。
• %lo :⼋进制 long int 类型。
• %lx :⼗六进制 long int 类型。
• %lu :unsigned long int 类型。
• %lld :⼗进制 long long int 类型。
• %llo :⼋进制 long long int 类型。
• %llx :⼗六进制 long long int 类型。
• %llu :unsigned long long int 类型。
• %Le :科学计数法表⽰的 long double 类型浮点数。
• %Lf :long double 类型浮点数。
• %n :已输出的字符串数量。该占位符本⾝不输出,只将值存储在指定变量之中。
• %o :⼋进制整数。
• %p :指针。
• %s :字符串。
• %u :⽆符号整数(unsigned int)。
• %x :⼗六进制整数。
• %zd : size_t 类型。
• %% :输出⼀个百分号。
用格式符可以代替引用相关数据,如下的一段简单代码

#include <stdio.h>
int main()
{
	char b[] = { "读者都发财" };
	int a = 8;
	printf("%d\n", a);
	printf("%s\n", b);
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

它的显示如下

它并没有输出%d,%s而是输出了对应的数据同时也规定了输出数据的模式分别为⼗进制整数(%d)和字符串(%s)。如果对此还有疑问的话可以看以下代码

#include <stdio.h>
int main()
{
	printf("%d", 'a');
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

它的显示为下

这段代码打印的是字符’a’的ASCII码值,而不是字符’a’本身这便是输出格式化的一小点体会,当然,输出格式化可不会这么简单,比如下面要说的限定宽度

限定宽度

限定宽度是指printf() 允许限定占位符的最⼩宽度。*** 而不是最终宽度***也许现在还不太理解但下面这段代码将解决一些疑问

#include <stdio.h>
int main()
{
	printf("%5d\n", 78);
	printf("%5d\n", 78465476);

	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

它的结果是这样的

可以明显看到这其中的差异输出结果78因为没有达到相应的最⼩宽度(5位)所以向右输出了3位才输出78(右对齐),而78465476超过了5位没有向右输出多的位数但也没有少位这便是最⼩宽度的意义(如果希望改成左对⻬,在输出内容后⾯添加空格,可以在占位符的 % 的后⾯插⼊⼀个 - 号)下面便介绍最⼩宽度的使用方法

整数部分的最⼩宽度使用方法

整数部分的最⼩宽度使用方法很简单便是在%后加入你想要的最⼩宽度值便行了如下面代码所示(顺便展示左对齐和右对齐的区别)

#include <stdio.h>
int main()
{
	printf("%5d\n", 78);
	printf("%-5d", 78);
	printf("hh");
	

	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

输出结果如图所示

但我们不光有整数还有小数,下面便介绍小数的最⼩宽度使用方法。

小数的最⼩宽度使用方法

如果只是限定整体的化很简单和整形一样只要在%后加最⼩宽度就行如下

#include <stdio.h>
int main()
{
	printf("%f\n", 1.2);
	printf("%15f\n", 1.2);
	

	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

因为%f表⽰输出的浮点数最少要占据12位所以加的15来表示差距,结果如下

但是小数部分始终没有限定,下面便介绍小数部分的限定方法:便是在%后加.x(x为数字)如下代码所示

#include <stdio.h>
int main()
{
	printf("%f\n", 1.2);
	printf("%.1f\n", 1.2);
	

	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

输出结果如下
但是每一次都要用X.X 的方式实在麻烦有没有简单的方法呢?
答案是有的那便是:最⼩宽度和⼩数位数这两个限定值,都可以⽤ * 代替,通过 printf() 的参数传⼊。可能抽象那么用代码说话。

#include <stdio.h>
int main()
{
	printf("%f\n", 1.2);
	printf("%*.*f\n", 5,1,1.2);
	

	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这段代码中前面的两个是控制整体最⼩宽度和小数的最⼩宽度最后是输出值。结果如下

这下可以相对简单的控制小数的位数

输出部分字符串

占位符⽤来输出字符串,默认是全部输出。如果只想输出开头的部分,可以⽤ %.X指定输出的⻓度,其中X代表⼀个数字,表⽰所要输出的⻓度如下代码所示

#include <stdio.h>
int main()
{
	printf("%.10s", "作者是帅哥,读者是有钱人");

	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里运行的结果是作者是帅哥(中文一个字要两个位置),而没有输出读者是有钱人如下。

输出符号

默认情况下, printf() 不对正数显⽰ + 号,只对负数显⽰ - 号。如果想让正数也输出 + 号,可以在占位符的 % 后⾯加⼀个 +。

#include <stdio.h>
int main()
{
	printf("%+d\n", 12);
	printf("%-d", -12);

	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

结果如下

这便是我对printf的了解欢迎大家的斧正

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/64776
推荐阅读
相关标签
  

闽ICP备14008679号