printf称为格式化输出函数
,私认为在调整输出的方面比C++中标准输出输出cout
函数好用,并且更加高效。
函数原型:
int printf(const char * format, [,argument] );
printf函数是一个"可变参数函数"
(即函数参数的个数是可变的)。
确切的说,是输出参数
的个数是可变的,即原型中的[]部分;
且每一个输出参数的输出格式都有对应的格式说明符与之对应,即格式串format
的左端第一个格式说明符对应第一个输出参数,以此类推,也不容易将格式说明符想象成占位符。
格式说明符的一般形式如下(方括号 [] 中的项为可选项):
%[flags][width][.prec][length] type_char
/*用中文标识如下:*/
%[标志符][宽度][精度][长度]类型符
它用以表示输出数据的类型
,下表所示:
符 号 | 类 型 | 说 明 | 示 例 | 结 果 |
---|---|---|---|---|
% | 无 | 输出字符“%”本身 | printf("%%"); | % |
d、i | int | 以带符号十进制整型输出 | printf("%i,%d", 100,100); | 100,100 |
u | unsigned int | 以无符号整型输出 | printf( “%u,%u”,100u,100); | 100,100 |
o | unsigned int | 以八进制无符号整S输出 | printf( "%o”,100); | 144 |
x | unsigned int | 以十六进制小写输出 | printf("%x",11); | b |
X | unsigned int | 以十六制大写输出 | printf("%X",11); | B |
f | float/double | 小数形式单、双精度浮点数 | printf("%f",3.14159); | 3.141590 |
e/E | float/double | 指数形式的单、双精度浮点数 | printf("%e",3.14159); | 3.141590e+00 |
g或G | float/double | 以%f或%e形式输出浮点数 | printf("%g",3.14159); | 3.171590 |
c | char | 单个字符 | printf("%c %c %c",‘c’,’+’,’+’); | c + + |
s | string | 字符串(字符数组) | printf("%s",“welcom to c++”); | welcom to c++ |
p | 地址 | 输出一个指针 | string s = “welcom to c++”; printf("%p",&s); | 32/64位的地址数值 |
这里注意一个问题:
在C语言中用%s输出字符数组是可以的,
但是如果是输出C++中定义的string类型的字符串,则需要先转换成C字符数组
string str = "hello"; printf("%s",str.c_str());
它用于规定输出格式
*(对齐方式),如下表所示。
符号 | 说 明 |
---|---|
(空白) | 右对齐,左边填充 0 和空格 |
(空格) | 输出值为正时加上空格,为负时加上负号 |
- | 输出结果为左对齐(默认为右对齐),右边填空格 |
+ | 在数字前增加符号“+”(正号)或“-”(负号) |
# | 类型符是o、x、X吋,增加前缀0、0x、0X; |
0 | 参数的前面用0填充,直到占满指定列宽为止(如果同时存在“-”,将被“-”覆盖,导致 0 被忽略 |
它用于控制显示数值的宽度
,如下表 所示。
符号 | 说 明 |
---|---|
n | 至少输出 n 个字符(n 是一个正整数)。否则用空格填满余下的位置 |
0n | 至少输出 n 个字符(n 是一个正整数)。否则用0满余下的位置 |
它用于控制显示数值的精度
。
如果输出的是数字,则表示小数的位数
;
如果输出的是字符,则表示输出字符的个数
;
若实际位数大于所定义的精度数,则截去
超过的部分。
如下表所示。
符号 | 说明 |
---|---|
无 | 系统默认精度 |
.0 | 对于 d、i、o、u、x、X等整形类型符,采用系统默认精度;对于f、F、e、E等浮点类型符,不输出小数部分 |
.n | 1) 对于d、i、o、u、x、X类型符,至少输出 n 位数字,且:少于n位,用0填充;对于n位,不截断。 |
.n | 2)对于 s 类型符,如果对应的输出串的长度不超过 n 个字符,则将其原样输出,否则输出其头 n 个宁符 |
它用于控制显示数值的长度,不常用,感兴趣的同学自己了解。
注意事项:
从右至左
进行处理的,所以尽量不要在 printf 语句中改变输出变量的值int k=8;
printf("%d,%d\n",k,++k);
/*输出9 9
可以写成
printf("%d\n",k);
printf("%d\n",++k);
*/
有时候,我们需要输出的宽度或者位数是实现不确定的,则我们可以在格式串中引入替代符号*
,例如
printf("%0*d\n", 5, 10); // 00010
printf("%.*f\n", 2, 10.12345); // 10.12
若用一个输入的变量来代替*
,则我们可以控制输出的宽度。
scanf 函数的功能与 printf 函数正好相反,执行格式化输入
功能。
输入地址
中。以此类推,直到格式串结束为止。函数原型:
int scanf(const char *format[,argument]);
同 printf 函数相似,scanf 函数也是一个“可变参数函数
”。
同时,scanf 函数的第一个参数 format 也必须是一个格式化串
。
除此格式化串之外,scanf 函数还可以有若干个输入地址
,且对于每一个输入地址,在格式串中都必须有一个格式说明符与之一一对应。即从格式串的左端第 1 个格式说明符对应第 1 个输入地址,以此类推。
注意:
argument表示参数的地址!要加“&”!
格式说明符(format)的一般形式:
%[*][width][length] type_char
/*用中文标识如下:*/
%[*][宽度][长度]类型符
和1.1
类似
格式字符 | 含义 |
---|---|
d或i | 带符号十进制整数 |
o | 无符号八进制数 |
x或X | 无符号十六进制数 |
u | 无符号十进制整数 |
f、e、E、g、G | 浮点数 |
c | 单个字符 |
s | 字符串 |
修饰符 | 说明 |
---|---|
* | 跳过读入数据,不存入对应的argument中 |
width | 指定输入数据所占用的宽度 |
modifiers | 指定由d、i、x、X、o、u、e、f、g说明的字符的大小 |
尽量不要在printf()
时,使用自增,自减符,除非你知道printf()
对于参数的计算顺序是从优到左,而且对于所有编译器,下面代码的结果不一定相同。
int x;
x = 1; printf("%d %d\n", x, x++);
x = 1; printf("%d %d\n", x++, x);
x = 1; printf("%d %d %d\n", x, x++, x);
x = 1; printf("%d %d %d %d\n", x, ++x, x++, x);