C-格式化输出和输入
格式化输出和输入
占位符
- 占位符就是先占住一个固定的位置, 等着你再往里面添加内容的符号
- 格式占位符 (%) 是在C/C++语言中格式输入函数, 如 scanf()、printf() 等函数中使用, 其意义就是起到格式占位的意思, 表示在该位置有输入或者输出
格式控制符 | 说明 |
---|---|
%c | 一个字符 |
%s | 一个字符串 |
%d %hd %ld | 十进制, 有符号的int/short/long 整型 |
%u %hu %lu | 十进制, 无符号的int/short/long 整型 |
%o %ho %lo | 八进制, 无前缀, 无符号的整型 |
%#o %#ho %#lo | 八进制, 有前缀, 无符号的整型 |
%x %hx %lx %X %hX %lX |
十六进制, 无前缀, 无符号的整型 x/X 对应十六进制大小写 |
%#x %#hx %#lx %#X %#hX %#lX |
十六进制, 有前缀, 无符号的整型 x/X 对应十六进制大小写 |
%f %lf | 十进制的float/double 浮点型 |
%e %le %E %lE |
指数形式的浮点型 e/E 对应指数大小写 |
%g %lg %G %lG |
十进制和指数中较短的形式输出浮点型, 并且小数部分的最后不会添加多余的0 e/E 对应指数大小写 |
格式化输出
int printf(const char* format, ...)
;
fromat
为格式化字符串, 包含两部分. 第一部分是正常字符, 原样输出. 第二部分是格式占位符....
为可变参数列表, 可变参数个数与格式占位符数量一致.- 返回字符的个数. (包括空白字符)
#include <stdio.h>
int main()
{
int a = 100;
int b = 200;
int c = a + b;
printf("a = %d, b = %d, "
"a + b = %d", a, b, c);
}
格式化输入
int scanf(const char* format, ...);
- 按指定格式从键盘上把数据输入到指定变量中
- 参数与
printf()
一致 - 成功则返回读入的数据项数
- 遇到错误或遇到
end of line
, 返回EOF
int n;
scanf("%d", &n);
当用户从终端输入信息, 数据存放到输入缓冲区,
scanf()
函数通过地址找到变量存储区域, 然后缓冲区里的信息传送给变量这块地址
- 如果读取数字或字符串
空白字符(空格符、制表符和换行符)都视为一次输入的终止标记
在读取时会自动忽略空白字符, 即首先删除这些字符
需要严格按照规定的格式输入
int n, m;
scanf("%d+%d", &n, &m); // 1+2
printf("%d %d", n, m); // 1 2
- 如果读取字符
两个变量之间的空白字符也会被读入
不会忽略空白字符:
char n, m;
scanf("%c%c", &n, &m); // a b
printf("n = %c, m = %c", n, m); // n = a, m = (此为空格)
- 以回车结束一次输入时, 回车符会残留在缓冲区中
缓冲区的影响
当我们先后读取两个字符时, 代码如下:
#include <stdio.h>
int main()
{
char n, m;
scanf("%c", &n);
scanf("%c", &m);
printf("n = %c\nm = %c", n, m);
return 0;
}
我们先输入一个"a", 然后回车, 发现程序结束了, 显示输出"n = a\nm = ", 此处m实际上为回车符.
这就是缓存区中残留的回车符的影响.
解决方法有三:
- 方法一
char n, m;
scanf("%c\n", &n);
scanf("%c", &m);
printf("n = %c\nm = %c", n, m);
return 0;
- 方法二
char n, m;
scanf("%c", &n);
fflush(stdin);
scanf("%c", &m);
printf("n = %c\nm = %c", n, m);
return 0;
- 方法三
char n, m;
scanf("%c", &n);
int ch;
while ((ch = getchar()) != EOF && ch != '\n')
{
;
}
scanf("%c", &m);
printf("n = %c\nm = %c", n, m);
return 0;