1、printf()函数
1.1 函数原型
//若输出成功,则返回输出的字符数;若输出出错,返回负数
int printf(const char *format, item1, item2, ...);
1.2 转换说明符
转换说明 | 输出 |
---|---|
%a | 浮点数、十六进制数字和p-记数法(C99) |
%A | 浮点数、十六进制数字和p-记数法(C99) |
%c | 一个字符 |
%d | 有符号十进制整数 |
%e | 浮点数、e-记数法 |
%E | 浮点数、e-记数法 |
%f | 浮点数、十进制记数法 |
%g | 根据数值不同自动选择%f或%e。%e格式在指数小于-4或者大于等于精度时使用 |
%G | 根据数值不同自动选择%f或%E。%E格式在指数小于-4或者大于等于精度时使用 |
%i | 有符号十进制整数(与%d相同) |
%o | 无符号八进制整数 |
%p | 指针 |
%s | 字符串 |
%u | 无符号十进制整数 |
%x | 使用十六进制数字0f的无符号十六进制整数 |
%X | 使用十六进制数组0F的无符号十六进制整数 |
%% | 打印一个百分号 |
1.3 转换说明修饰符
修饰符 | 意义 |
---|---|
标志 | 五种标志(-、+、空格、#和0)下面一个表格会描述。可以使用零个或多个标志 |
digit(s) | 字段宽度的最小值。如果该字段不能容纳要打印的数或者字符串,系统就会使用更宽的字段;示例: “%4d” |
.digit(s) | 精度。对于%e、%E和%f转换,是将要在小数点的右边打印的数字的位数。对于%g和%G转换,是有效数字的最大位数。对于%s转换,是将要打印的字符的最大数目。对于整数转换,是将要打印的数字的最小位数;示例: “%5.2f”打印一个浮点数,它的字段宽度为5个字符,小数点后有两个数字 |
h | 和整数转换符一起使用,表示一个short int 或unsigned short int类型数值;示例:“%hu”、“%hx”和“%6.4hd” |
hh | 和整数转换符一起使用,表示一个signed char 或unsigned char类型数值;示例:“%hhu”、“%hhx”和“%6.4hhd” |
j | 和整数转换说明符一起使用,表示一个intmax_t或uintmax_t值;示例:“%jd”和“%8jX” |
l | 和整数转换说明符一起使用,表示一个long int或unsigned long int类型值;示例:“%ld”和“%8lu” |
ll | 和整数转换说明符一起使用,表示一个long long int 或unsigned long long int类型值(C99);示例:“%lld”和“8llu” |
L | 和浮点转换说明符一起使用,表示一个long double值;示例:“%Lf”和“%10.4Le” |
t | 和整数转换说明符一起使用,表示一个ptrdiff_t值(与两个指针之间的差相对应的类型)(C99);示例:”%td“和”%12ti“ |
z | 和整数转换说明符一起使用,表示一个size_t值(sizeof返回的类型)(C99);示例:“%zd”和“%12zx” |
1.4 标志
标志 | 意义 |
---|---|
- | 项目时左对齐的:也就是说,会把项目打印在字段的左侧开始处;示例:“%-20s” |
+ | 有符号的值若为正,则显示带加号的符号;若为负,则带减号的符号;示例:“%+6.2f” |
(空格) | 有符号的值若为正,则显示时带前导空格(但是不显示符号);若为负,则带减号符号。+标志会覆盖空格标志;示例:“% 6.2f” |
# | 使用转换说明的可选形式。若为%o格式,则以0开始;若为%x和%X格式,则以0x或0X开始。对于所有的浮点形式,#保证了即使不跟任何数字,也打印一个小数点字符。对于%g和%G格式,它防止尾随零被删除;示例:“%#o”、“#8.0f”和“%+#10.3E” |
0 | 对于所有的数字格式,用前导零而不是用空格填充字段宽度。如果出现-标志或者指定了精度(对于整数)则忽略该标志;示例: “%010d”和“%08.3f” |
1.5 参数传递
printf(“%ld %ld %ld %ld\n”, n1, n2, n3, n4);
该调用告诉计算机把变量n1、n2、n3、n4的值传递给计算机,计算机把它们放置到被称为堆栈(stack)的一块内存区域中来实现。计算机根据变量的类型而非转换说明符把这些值放到堆栈中。所以,n1在堆栈中占用8个字节(float值在被用于表达式中或者被用作参数之前,会被自动转换为double类型)。同样,n2占用8个字节,而n3和n4则分别占用4个字节。然后控制转移到printf()函数。该函数从堆栈把值读出来,但是在读取时,它根据转换说明符去读取。%ld说明符指出,printf()应该读取4个字节,所以printf()在堆栈中读取前4个字节作为它的第一个值。这就是n1的前半部分,它被解释成一个长整数(long int)。下一个%ld说明符再读取4个字节;这就是n1的后半部分,它被解释成第二个长整数(long int)。同样,%ld的第三个和第四个实例使得n2的前半部分和后半部分被读出,并解释成两个长整数(long int)。所以虽然n3和n4的说明符正确,但是printf()仍然读取了错误的字节。
1.6 打印较长的字符串
方法1 是使用多个printf()语句。
方法2 用反斜杠符号(\)和回车键的组合来结束一行。
方法3 采用字符串连接的方法。如果在一个用双引号引起来的字符串后面跟有另一个用双一号引起来的字符串,而且二者之间仅用空白字符分隔,那么C会把该组合当作一个字符串来处理。
/*以下所有方法输出效果一样*/
//方法1
printf("hello,young lovers,");
printf("wherever you are.");
//方法2
printf("hello,young lovers,\
wherever you are.");
//方法3
printf("hello,young lovers,"
"wherever you are.");
//方法3
printf("hello,young lovers," "wherever you are.");
2、scanf()函数
2.1 函数原型
//返回值为成功读入的项目的个数,如果检测到文件结尾,它返回EOF(它的值一般定义为-1)
int scanf(const char *format, item1, item2, …);
2.2 转换说明符
转换说明符 | 意义 |
---|---|
%c | 把输入解释成一个字符 |
%d | 把输入解释成一个有符号十进制整数 |
%e, %f, %g, %a | 把输入解释成一个浮点数(%a是C99标准) |
%E, %F, %G, %A | 把输入解释成一个浮点数(%a是C99标准) |
%i | 把输入解释成一个有符号十进制整数 |
%o | 把输入解释成一个有符号八进制整数 |
%p | 把输入解释成一个指针(一个地址) |
%s | 把输入解释成一个字符串:输入的内容以第一个非空白字符作为开始,并且包含直到下一个空白字符的全部字符 |
%u | 把输入解释成一个无符号十进制整数 |
%x, %X | 把输入解释成一个有符号十六进制整数 |
2.3 转换修饰符
修饰符 | 意义 |
---|---|
* | 滞后赋值;示例:“%*d” |
digit(s) | 最大字段宽度:在达到最大字段宽度或者遇到第一个空白字符时停止对输入项的读取;示例:“%10s” |
hh | 把整数读作signed char或者unsigned char;示例:“%hhd”、“hhu” |
ll | 把整数读作long long或者unsigned long long(C99);示例:“%lld”、“llu” |
h, l或 L | “hd”和“hi”指示该值将会存储在一个short int中。“%ho”、“%hx”和“%hu”指示该值将会存储在一个unsigned short int中。“%ld”和“%li”指示该值将会存储在一个long中。“%lo”、“%lx”和“%lu”指示该值将会存储在一个unsigned long中。“%le”、“%lf”和“%lg”指示该值以double类型存储。将L与e、f和g一起使用指示该值将以long double类型存储。如果没有这些修饰符,d、i、o和x指示int类型,而e、f和g指示float类型 |
2.4 scanf()函数读取规则
(1)除了%c说明符以外,scanf()读取输入字符前,会跳过空白字符(空格、制表符、换行符)直到遇到一个非空白字符,如果该字符与所期望的字符(如数字)匹配,继续读取下一个字符,直到读取到空白字符(空格、制表符、换行符)、非匹配字符(如%d读取到非数字字符,并且将该字符放回缓冲区,待下次读取)或者字段结尾(使用字段宽度限制),结束读取。
(2)%c说明符,不会跳过空白字符。
(3)如果格式字符串中包含除空格以外的普通字符,那么输入字符串必须与之准确匹配,如“%d,%d”,输入的时候,必须在一个整数后面紧跟一个逗号‘,’,否则读取失败,并且这个不是逗号的字符将被放回缓冲区,结束读取。
(4)如果格式字符串中包含空格,那么将意味着跳过下一个输入项之前的任何空白字符。如“%d, %d”,那么你的输入必须是一个整数后面紧跟一个逗号,再后面可以跟任何空白字符,再跟一个整数。当然在整个输入的前面,你可以有空白字符,由于scanf自身的读取原因会跳过这些空白字符。再例如“%c”与“ %c”不同,前者读取输入中的第一个字符,后者读取遇到的第一个非空白字符。