1.printf
1.1.printf
的输出控制符
格式控制符 | 说明 |
---|---|
%c | 输出一个单一的字符 |
%hd、%d、%ld | 以十进制、有符号的形式输出 short、int、long 类型的整数 |
%hu、%u、%lu | 以十进制、无符号的形式输出 short、int、long 类型的整数 |
%ho、%o、%lo | 以八进制、不带前缀、无符号的形式输出 short、int、long 类型的整数 |
%#ho、%#o、%#lo | 以八进制、带前缀、无符号的形式输出 short、int、long 类型的整数 |
%hx、%x、%lx%、hX、%X、%lX | 以十六进制、不带前缀、无符号的形式输出 short、int、long 类型的整数。如果 x 小写,那么输出的十六进制数字也小写;如果 X 大写,那么输出的十六进制数字也大写。 |
%#hx、%#x、%#lx、%#hX、%#X、%#lX | 以十六进制、带前缀、无符号的形式输出 short、int、long 类型的整数。如果 x 小写,那么输出的十六进制数字和前缀都小写;如果 X 大写,那么输出的十六进制数字和前缀都大写。 |
%f、%lf | 以十进制的形式输出 float、double 类型的小数 |
%e、%le、%E、%lE | 以指数的形式输出 float、double 类型的小数。如果 e 小写,那么输出结果中的 e 也小写;如果 E 大写,那么输出结果中的 E 也大写。 |
%g、%lg、%G、%lG | 以十进制和指数中较短的形式输出 float、double 类型的小数,并且小数部分的最后不会添加多余的 0。如果 g 小写,那么当以指数形式输出时 e 也小写;如果 G 大写,那么当以指数形式输出时 E 也大写。 |
%s | 输出一个字符串 |
#include <iostream>
int main()
{
printf("%%c=%c\n", 'a');
printf("%%hd=%hd,%%d=%d,%%ld=%ld\n", 1000, 1000, 1000);
printf("%%hu=%hu,%%u=%u,%%lu=%lu\n", 1000, 1000, 1000);
printf("%%ho=%ho,%%o=%o,%%lo=%lo\n", 1000, 1000, 1000);
printf("%%#ho=%#ho,%%#o=%#o,%%#lo=%#lo\n", 1000, 1000, 1000);
printf("%%hx=%hx,%%x=%x,%%lx=%lx,%%hX=%hX,%%X=%X,%%lX=%lX\n", 1000,1000,1000,1000,1000,1000);
printf("%%#hx=%#hx,%%#x=%#x,%%#lx=%#lx,%%#hX=%#hX,%%#X=%#X,%%#lX=%#lX\n", 1000, 1000, 1000, 1000, 1000, 1000);
printf("%%f=%f,%%lf=%lf\n", 31.4, 31.4);
printf("%%e=%e,%%le=%le,%%E=%E,%%lE=%lE\n", 31.4, 31.4, 31.4, 31.4);
printf("%%g=%g,%%lg=%lg,%%G=%G,%%lG=%lG\n", 31.4, 31.4, 31.4, 31.4);
printf("%%s=%s\n", "hello");
}
注意:从上述输出中%lX、%#lX
的输出不太符合预期。
1.2.如何输出 %d
、\
和双引号
要输出%d
只需在前面再加上一个%
,要输出\
只需在前面再加上一个\
,要输出双引号也只需在前面加上一个\
即可。
#include <iostream>
int main(void)
{
printf("%%d\n");
printf("\\\n");
printf("\"\"\n");
return 0;
}
1.3.精度,显示宽度,对齐,符号
#include <iostream>
int main()
{
printf("%%f=%f\n", 3.14);
printf("%%10.3f=%10.3f\n", 3.14);
printf("%%-10.3f=%-10.3f\n", 3.14);
printf("%%+10.3f=%+10.3f\n", 3.14);
}
(1).精度
默认下小数点保留6
位。使用m.n
中n
可以显式指定小数点保留位数。n
针对字符串时,可以指定要显示的字符数。
(2).显示宽度
m.n
中的m
用于控制数值显示的最小宽度,就是说显示宽度小于m
时候,通过补充空格使得宽度达到m
。
(3).对齐
默认在高位补充空格,数值放在低位。如果采用-m.n
,则在低位补充空格,数值放在高位。
(4).符号
输出的数值对正数默认不输出+
,如输出控制前添加+
,会输出+
。
2.变长参数
#include <iostream>
#include <stdarg.h>
void minprintf(char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
for (char* p = fmt; *p; p++)
{
if (*p != '%') {
putchar(*p);
continue;
}
switch (*++p) {
case 'd':
printf("%d", va_arg(ap, int));
break;
case 'f':
printf("%f", va_arg(ap, double));
break;
case 's':
printf("%s", va_arg(ap, char *));
break;
default:
putchar(*p);
break;
}
}
va_end(ap);
}
int main()
{
minprintf("s=%s\nd=%d\nf=%f\n", "hello", 10, 3.14);
}
2.1.可变形参
形参中...
用于表示形参数量可变,每个形参类型不明确。
可变形参的...
必须放在形参列表最后。
2.2.解析可变形参
(1).初始化
va_list ap;
va_start(ap, fmt);
(2).逐个提取可变形参
va_arg(ap, int);
va_arg(ap, double);
va_arg(ap, char *);
提取时候要么按照固定的约定去提取,要么采用上例中在前面形参中添加提示的方式来确定当前要提取形参的类型。
va_arg
的返回值就是提取类型对应的形参的数值。
(3).结束
va_end(ap);
3.scanf
格式:%[数据宽度] [数据长度] 数据类型字符
3.1.数据类型
格式字符 | 输出示例 | 意义 |
---|---|---|
d | int a; scanf(“%d”,&a); | 输入十进制整数 |
u | unsigned u; scanf(“%u”,&u); | 输入无符号十进制整数 |
o | int a; scanf(“%o”,&a); | 输入八进制整数 |
x | int x; scanf(“%x”,&x); | 输入十六进制整数 |
f | float f; scanf(“%f”,&f); | 输入小数形式的实数 |
c | char c; scanf(“%c”,&c); | 输入单个字符 |
s | char* s; scanf(“%s”,s); | 输入字符串 |
#include <stdio.h>
#include <string.h>
int main()
{
int a;
printf("int\n");
scanf("%d",&a);
printf("%d\n", a);
unsigned u;
printf("unsigned:\n");
scanf("%u", &u);
printf("%u\n", u);
int o;
printf("O:\n");
scanf("%o", &o);
printf("%d\n", o);
int x;
printf("x:\n");
scanf("%x", &x);
printf("%d\n", x);
float f;
printf("f:\n");
scanf("%f", &f);
printf("%f\n", f);
char c;
printf("c:\n");
getchar();
scanf("%c", &c);
printf("%c\n", c);
char s[1000];
printf("s:\n");
scanf("%s", s);
printf("%s\n", s);
return 0;
}
3.2.数据宽度
用十进制整数指定输入数据的宽度(即字符数),若输入字符数超出指定值,超出部分被截去。
例如:scanf("%5f",&Pi);
输入3.1415925
,scanf( )
只是把 3.141
这 5
个字符存储在了变量中,其余部分被截去。
3.3.数据长度
长度格式符有 l
和 h
两种。l
表示输入长整型数(如 %ld
)或双精度浮点数(如 %lf
)。h
表示输入短整型数或单精度浮点数。
3.4.注意
(1). 不支持精度控制。这样scanf("%.2f",&Pi);
是非法的。
(2). 接收字符串输入时,遇到空格会认为输入结束。
(3). scanf
遭遇失败场景,为了不影响后续处理,可能需要getchar()
或fflush(stdin);
清理掉标准输入缓存中剩余数据。
伪随机数生成器
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main() {
srand(time(NULL));
for(int i = 0; i < 10; i++) {
int r = rand();
cout << r << endl;
}
return 0;
}