printf()是输出函数,scanf()是输入函数,但是它们的工作原理几乎相同。两个函数都使用格式字符串和参数列表。
printf()函数的格式
printf( 格式字符串, 待打印项1, 待打印项2,…);待打印项1、待打印项2等都是要打印的项。它们可以是变量、常量,甚至是在打印之前先要计算的表达式。格式字符串是双引号括起来的内容。
例如:printf(“The %d contestants ate %f berry pies.\n”, number, pies);
注意:格式字符串中的转换说明一定要与后面的每个项相匹配,若忘记这个基本要求会导致严重的后果。
printf()的转换说明修饰符
sizeof
运算符以字节为单位返回类型或值的大小。这个大小应该是某种形式的整数,但标准只规定该值是无符号整数。在不同的实现中,它可以是unsigned int
、unsigned long
甚至是unsigned long long
。因此,如果要使用printf()
函数显示sizeof
表达式,根据不同系统可能需要使用%u
、%lu
或%llu
。这就意味着要查找当前系统的用法,如果将程序移植到不同的系统,可能需要进行修改。
鉴于此,C提供了更好可移植性的类型。首先,stddef.h
头文件(在包含stdio.h
头文件时已包含其中)将size_t
定义为系统使用sizeof
返回的类型,这被称为底层类型(underlying type)。其次,printf()
使用z
修饰符表示打印相应的类型。同样,C还定义了ptrdiff_t
类型和t
修饰符,用来表示系统使用的两个地址差值的底层有符号整数类型。
float类型
对于浮点类型,有用于double和long double类型的转换说明,却没有float类型的。这是因为在K&R C中,表达式或参数中的float类型值会被自动转换成double类型。printf()函数中所有float类型的参数(对未使用显式原型的所有C函数都有效)仍自动转换成double类型。因此,无论是K&R C还是ANSI C,都没有显示float类型值专用的转换说明。
printf()的返回值
大部分C函数都有一个返回值,这是函数计算并返回给主调程序(calling program)的值,printf()函数也有一个返回值,它返回打印字符的个数。如果有输出错误,printf()则返回一个负值(printf()的旧版本会返回不同的值)。不过该函数的返回值基本不会用到。
看这个例子,打印“hello world”返回12(结束符和空格各占1个字节)。
打印长字符串
在一些大公司里,为了方便阅读,代码规范对每一行代码的长度有要求,例如linux内核规定一行不超过80字符,那我们就要换行了。
如下图,如果是逗号后面换行无所谓,如果是双引号内直接换行就会报错。
一种方法是**加反斜杠 **,但是这种方法需要顶格,不然会有多余空白。
还有一种方法是拆成多个双引号括起来的字符串。
scanf函数
scanf()中的格式字符串表明字符输入流的目标数据类型。
例如:scanf(“%s”, pet);
就是将键盘输入的字符串保存到pet这个变量里,pet是个char类型的数组,字符串格式用%s。
简单记住两条规则:
用scanf()读取基本变量类型的值,在变量名前加上一个&;
用scanf()把字符串读入字符数组中,不要使用&。
&是取址符。