输入输出函数(printf 和 scanf)是C语言中非常重要的两个函数。输出函数的功能是将程序运行的结果输出到屏幕上,而输入函数的功能是通过键盘给程序中的变量赋值。可以说输入输出函数是用户和计算机交互的接口。其中 printf 的功能很强大,用法很灵活,比较难掌握;而 scanf 的用法相对比较固定,但也有很多需要注意的地方。本文我们先介绍printf 的用法,稍后再介绍scanf。

如果在程序中要使用 printf 或者 scanf,那么就必须要包含头文件 stdio.h。因为这两个函数就是包含在该头文件中的。

printf函数称为格式输出函数,其关键字最末一个字母 f 即为“格式”(format)之意。其功能是按用户指定的格式,把指定的数据显示到显示器屏幕上。

声明

以下是C中对printf()函数的声明:

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

参数

printf有一个必选的字符串参数,和一个可选的附加参数列表。

  • format – 这是字符串,包含了要被写入到标准输出 stdout 的文本。它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。
    format 标签的格式化抽象语法:
%[flags][width][.precision][length]specifier

flags(标识)

描述

-

在给定的字段宽度内左对齐。默认是右对齐(参见 width 子说明符)。

+

强制在结果之前显示加号或减号(+ 或 -),即正数前面会显示 + 号,负数前显示 - 号。默认情况下,只有负数前面会显示一个 - 号。

空格

如果没有写入任何符号,则在该值前面插入一个空格。

#

与 o、x 或 X 说明符一起使用时,非零值前面会分别显示 0、0x 或 0X。

与 e、E 和 f 一起使用时,会强制输出包含一个小数点,即使后边没有数字时也会显示小数点。默认情况下,如果后边没有数字时候,不会显示显示小数点。

与 g 或 G 一起使用时,结果与使用 e 或 E 时相同,但是尾部的零不会被移除。

0

在指定填充 padding 的数字左边放置零(0),而不是空格(参见 width 子说明符)。

width(宽度)

描述

(number)

要输出的字符的最小数目。如果输出的值短于该数,结果会用空格填充,并且右对齐。如果输出的值长于该数,结果不会被截断。

*

宽度在 format 字符串中未指定,但是会作为附加整数值参数放置于要被格式化的参数之前。

.precision(精度)

描述

.number

对于整数说明符(d、i、o、u、x、X):precision 指定了要写入的数字的最小位数。如果写入的值短于该数,结果会用前导零来填充。如果写入的值长于该数,结果不会被截断。精度为 0 意味着不写入任何字符。

对于 e、E 和 f 说明符:要在小数点后输出的小数位数。

对于 g 和 G 说明符:要输出的最大有效位数。

对于 s: 要输出的最大字符数。默认情况下,所有字符都会被输出,直到遇到末尾的空字符。

对于 c 类型:没有任何影响。

当未指定任何精度时,默认为 1。如果指定时不带有一个显式值,则假定为 0。

length(长度)

描述

h

参数被解释为短整型或无符号短整型(仅适用于整数说明符:i、d、o、u、x 和 X)。

l

参数被解释为长整型或无符号长整型,适用于整数说明符(i、d、o、u、x 和 X)及说明符 c(表示一个宽字符)和 s(表示宽字符字符串)。

L

参数被解释为长双精度型(仅适用于浮点数说明符:e、E、f、g 和 G)。

specifier(标识符)

描述

d

以十进制形式输出带符号整数(正数不输出符号)

o

以八进制形式输出无符号整数(不输出前缀0)

x,X

以十六进制形式输出无符号整数(不输出前缀Ox)

u

以十进制形式输出无符号整数

f

以小数形式输出单、双精度实数。默认小数部分输出 6 位,超过 6 位的四舍五入。

e,E

以指数形式输出单、双精度实数

g,G

以%f或%e中较短的输出宽度输出单、双精度实数

c

输出单个字符

s

输出字符串

p

输出指针地址

lu

32位无符号整数

llu

64位无符号整数

  • 附加参数 – 根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签。参数应与 % 标签的个数和顺序都相同。

返回值

  • 如果成功,则返回写入的字符总数,否则返回一个负数。

常用的基本数据类型对应的占位符

systemverilog 函数输出输入输出为队列 输入输出函数的作用_无符号整数

常用的转义字符

转义字符

描述

ASCII码(十进制)

\a

响铃(BEL)

007

\b

退格(BS) ,将当前位置移到前一列

008

\t

水平制表(HT)

009

\n

换行(LF) ,将当前位置移到下一行开头

010

\v

垂直制表(VT)

011

\f

换页(FF),将当前位置移到下页开头

012

\r

回车(CR) ,将当前位置移到本行开头

013

\"

双引号

034

%%

百分号

037

\’

单引号

039

\\

反斜杠

092

实例:

一些会频繁使用的用法:

#include<stdio.h>
int main()
{
	int a = 1234;
	float b = 5.6789;
	char c[] = "abcde";

	printf("1:%d\n",a);
	printf("2:%+d\n",a);
	printf("3:右对齐%10d\n",a);
	printf("4:%-10d左对齐\n",a,a);
	printf("5:%010d\n",a);
	printf("6:%f\n",b);
	printf("7:%.2f\n",b);
	printf("8:右对齐%10.2f\n",b);
	printf("9:%x\n",a);
	printf("10:%#x\n",a);
	printf("11:%e\n",b);
	printf("12:%s\n",c);
	printf("13:%p\n",c);
	printf("14:%c\n",c[0]);
	printf("15:\\\'\n\"\t%%");
}

输出:

systemverilog 函数输出输入输出为队列 输入输出函数的作用_无符号整数_02


到此,C中的printf函数简介就到此介绍完了。

最后想再提一下Java中的输出语句。Java SE5推出了C语言中printf()风格的格式化输出功能。不仅使得控制输出的代码更加简单,同时也给予Java开发者对于输出格式与排列更强大的控制能力。
C语言的printf()并不能像Java那样连接字符串:printf()并不能使用Java中重载的“+”操作符(C没有重载)来连接引号内的字符串或字符串变量,而是使用特殊的占位符来表示数据将来的位置。
Java SE5总共引入的format()方法可用于PrintStream或PrintWrite,其中也包括System.out对象。format()方法模仿自C的printf()。如果你比较怀旧的话,也可以使用printf(),而且printf()也能更加清晰地表达。

public class Test {
	public static void main(String[] args) {
		int x = 5;
		double y = 5.678;
		System.out.println("Row 1:[" + x + " " + y + "]");
		System.out.printf("Row 2:[%d %f]\n", x, y);
		System.out.format("Row 3:[%d %f]\n", x, y);
	}
}
/*output:
Row 1:[5 5.678]
Row 2:[5 5.678000]
Row 3:[5 5.678000]
*/

从上可以看出,Java中的printf()和format()是等价的(其实printf底层就是调用的format)。但是Java的printf()和C的printf()也有不同的地方。
在Java中,所有格式化输出功能都由java.util.Formatter类处理。format的格式化就是使用的它。
Formatter类的常规类型、字符类型和数值类型的格式说明符的语法如下:

%[argument_index$][flags][width][.precision]conversion

它还支持用来表示日期和时间类型的格式,语法如下:

%[argument_index$][flags][width]conversion