C语言的printf函数用法大全,小白不用再担心打不好基础啦

发布时间:2023年12月20日

在这里插入图片描述

一、介绍printf

输入输出函数(printf 和 scanf)是C语言中非常重要的两个函数,也是学习C语言必学的两个函数。在C语言程序中,基本上没有一个程序不需要这两个函数,尤其是输出函数(printf),所以这两个函数必须要掌握。如果在程序中要使用 printf 或者 scanf,那么就必须要包含头文件 stdio.h。因为这两个函数就是包含在该头文件中的。
*C 库函数 int printf(const char format, …) 发送格式化输出到标准输出 stdout。

输出函数的功能是将程序运行的结果输出到屏幕上,而输入函数的功能是通过键盘给程序中的变量赋值。可以说输入输出函数是用户和计算机交互的接口。其中 printf 的功能很强大,用法很灵活,比较难掌握;而 scanf 的用法相对比较固定,但也有很多需要注意的地方。
#容易造成误解。但是如果输出 0x2f 或 0x2F,那么人家一看就知道是十六进制。而且%#x和%#X中,笔者觉得大写的比较好,因为大写是绝对标准的十六进制写法。

二、printf 的格式

printf 函数的原型为:

# include <stdio.h>

int printf(const char *format, ...);

在讲每一个函数的时候都会先把它的函数原型写出来,这个原型你们现在看不懂不要紧,等到学完C语言之后再来看这个原型就会发现它是很有参考意义的!它对深刻理解函数有着很大的价值。

printf 的格式有四种:

1) printf(“字符串\n”);

# include <stdio.h>
int main(void)
{
printf("Hello World!\n"); // \n表示换行
return 0;
}

这句话的意思是将变量 i 以十进制输出。
那么现在有一个问题:i 本身就是十进制,为什么还要将 i 以十进制输出呢?
因为程序中虽然写的是 i=10,但是在内存中并不是将 10 这个十进制数存放进去,而是将 10 的二进制代码存放进去了。计算机只能执行二进制 0、1 代码,而 0、1 代码本身并没有什么实际的含义,它可以表示任何类型的数据。所以输出的时候要强调是以哪种进制形式输出。所以就必须要有“输出控制符”,以告诉操作系统应该怎样解读二进制数据。

如果是%x就是以十六进制的形式输出,要是%o就是以八进制的形式输出,小伙伴们可以自己试一下。

2) printf(“输出控制符1 输出控制符2…”, 输出参数1, 输出参数2, …);

# include <stdio.h>
int main(void)
{
int i = 10;
int j = 3;
printf("%d %d\n", i, j);
return 0;
}

输出控制符 1 对应的是输出参数 1,输出控制符 2 对应的是输出参数 2……编译、链接、执行后我们看一下输出结果:
10 3

注意一下,为什么 10 和 3 之间有一个空格?因为上面 %d 和 %d之间有空格,printf 中双引号内除了输出控制符和转义字符\n外,所有其余的普通字符全部都原样输出。比如:

#include <stdio.h>
int main(void)
{
int i = 10;
int j = 3;
printf("i = %d, j = %d\n", i, j);
return 0;
}

这时我们再编译、链接、执行一下:
i = 10, j = 3

i=、,、空格和j=全都原样输出了。此外需要注意的是:“输出控制符”和“输出参数”无论在“顺序上”还是在“个数上”一定要一一对应。

3) printf(“输出控制符 非输出控制符”,输出参数);

这实际上就是上面那个例子。这时候会有一个问题:到底什么是“输出控制符”,什么是“非输出控制符”?很简单,凡是以%开头的基本上都是输出控制符。

三、输出控制符

在这里插入图片描述

课外补充:

格式控制符:

%---格式说明引导符。

----指定左对齐输出。

0---指定空位填零。

m.n --- 指定输出域宽度及精度。

l.h---输出长度的修正。

格式字符:

%i---输出一个整型数;

%d---输出一个整型数;

%f---输出一个浮点数;

%e---输出一个浮点数,科学计数法;

%g---输出一个浮点数,当指数小于-4或者大于5,则运用科学计数法,否则正常显示浮点数;

%c---输出一个字符;

%o---输出一个八进制的整型数,前面不带0;

%#o---输出一个八进制的整型数,前面带0;

%x---输出一个十六进制的整型数,前面不带0x;

%#x---输出一个十六进制的整型数,前面带0x, 如果x大写,则显示的时候也是大写。

%u---不带符号的十进制整数。

%%---输出一个%.

转义字符:

\a:蜂鸣,响铃

\b:回退:向后退一格

\f:换页

\n:换行,光标到下行行首

\r:回车,光标到本行行首

\t:水平制表

\v:垂直制表

\:反斜杠

\':单引号

\":双引号

\?:问号

\ddd:三位八进制

\xhh:二位十六进制

\0:空字符(NULL),什么都不做

printf的格式控制的完整格式:

% - 0 m.n l或h 格式字符

下面对组成格式说明的各项加以说明:

①%:表示格式说明的起始符号,不可缺少。

②-:有-表示左对齐输出,如省略表示右对齐输出。

③0:有0表示指定空位填0,如省略表示指定空位不填。

④m.n:m指域宽,即对应的输出项在输出设备上所占的字符数。N指精度。用于说明输出的实型数的小数位数。为指定n时,隐含的精度为n=6位。

⑤l或h:l对整型指long型,对实型指double型。h用于将整型的格式字符修正为short型。


四、 %x、%X、%#x、%#X 的区别

一定要掌握 %x(或 %X 或 %#x 或 %#X),因为调试的时候经常要将内存中的二进制代码全部输出,然后用十六进制显示出来。下面写一个程序看看它们四个有什么区别:

#include <stdio.h>
int main(void)
{
int i = 47;
printf("%x\n", i);
printf("%X\n", i);
printf("%#x\n", i);
printf("%#X\n", i);
return 0;
}

在 VC++ 6.0 中的输出结果:

2f
2F
0x2f
0X2F

补充分享一个在线C语言(C++)编译器
编译器链接点我跳转
从输出结果可以看出:如果是小写的x,输出的字母就是小写的;如果是大写的X,输出的字母就是大写的;如果加一个#,就以标准的十六进制形式输出。

最好是加一个#,否则如果输出的十六进制数正好没有字母的话会误认为是一个十进制数呢!总之,不加#容易造成误解。但是如果输出 0x2f 或 0x2F,那么人家一看就知道是十六进制。而且%#x和%#X中,笔者觉得大写的比较好,因为大写是绝对标准的十六进制写法。

五、如何输出 %d、\ 和双引号

printf 中有输出控制符%d,转义字符前面有反斜杠\,还有双引号。那么大家有没有想过这样一个问题:怎样将这三个符号通过 printf 输出到屏幕上呢?

要输出%d只需在前面再加上一个%,要输出\只需在前面再加上一个\,要输出双引号也只需在前面加上一个\即可。程序如下:

# include <stdio.h>
int main(void)
{
printf("%%d\n");
printf("\\\n");
printf("\"\"\n");
return 0;
}

在 VC++ 6.0 中的输出结果是:

%d

\

""
六、总结如下

printf 是C语言中非常重要的一个函数。经过上面的学习我们发现,其实它并不难。只要多编程多练习,小伙伴们很快就能掌握。

其次学完本节之后要知道为什么需要“输出控制符”。因为计算机中所有的数据都是二进制 0、1 代码,所以输出的时候要用“输出控制符”告诉计算机以什么形式将二进制数据显示出来。

输出控制符中,%d、%f、%s、%c 是最常用的,它们分别是输出整数、实数、字符串和字符的控制符。有关 %x、%X、%#x、%#X 四种用法的区别,只需要了解一下即可。

【扩展】想一想,如何调用 printf() 函数输出具有以下格式的数据:

20 345 700 22
56720 9999 20098 2
233 205 1 6666
34 0 23 23006783

如果你想到的办法是:

printf("%d %d %d %d\n", 20, 345, 700, 22);
printf("%d %d %d %d\n", 56720, 9999, 20098, 2);
printf("%d %d %d %d\n", 233, 205, 1, 6666);
printf("%d %d %d %d\n", 34, 0, 23, 23006783);

这种方法虽然能实现,但过程太自虐了,要敲很多个空格,还要严格控制空格数,否则输出就会错位。实际上,printf() 函数还有一些更高级的玩法,比如自动调整数据的输出格式、控制输出小数的位数等,想学习 printf() 高级玩法的读者请关注我哦!

么么叽么么哒么么叽么么哒!!

文章来源:https://blog.csdn.net/m0_46579394/article/details/135101345
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。