printf和scanf的常见用法
仅满足个人作为大一学生的需求。(保命)
1 printf
printf格式控制字符串组成:%[flags][width][.prec][length]type
即%[标志][最小宽度][.精度][类型长度]类型。
类型type:
|字符|对应数据类型|含义|
|---|---|---|---|
d|int|输出十进制有符号整数|
f/F|float,double|输出浮点数(printf单精度双精度可都用f,但scanf不行),大写F只不过infinity和nan输出为大写形式|
e/E|float,double|科学记数法输出浮点数,大写E只不过输出时‘e’会变成‘E’
g/G|float,double|根据数值长度选择最短方式出,%f或%e,大写同理
c|char|输出字符
s|char*|输出字符串
- bool型的输出用 %d 就好
- 输出不会自动类型转换,可以用%c来输出int,但绝不能用%e,%g,%f来直接输出int,也不能用%c,%d来直接输出double和float。可以强制类型转换后输出。
- 对于string,若用%d输出,需要用&去首位地址,如
string str;...; printf("%s",&str[0]);
类型长度:
下面只介绍两种
类型长度 | d的对应类型 | e,E,f,F,g,G的对应类型 |
ll | long long | |
l | long double(这个我不太理解,因为lf也可以double) |
- 同样%lld,不能直接输出double(float),%lf不能直接输出long long,int,char。还有一点,%lld不能直接输出int,char。要输出可以可以强制类型转换。
还有一点,对于long long,win下应该为%I64d
:
linux下为:
1 long long a = 60122;
2 printf("%lld %lld %lld", a,a,a);
windows下为:
1 printf("%I64d %I64d %I64d", a,a,a);
long 和 int 都是4字节
long long 是8字节
精度(.precision)
精度格式符一"."开头,后跟十进制整数。可取值如下。
.precision | 描述 |
数值 | 十进制整数。 (1)对于整型(d),precision表示输出的最小的数字个数,不足补前导零,超过不截断。 (2)对于浮点型(a, e, f ),precision表示小数点后数值位数,默认为六位,不足补后置0,超过则截断。 (3)对于类型说明符g或G,表示可输出的最大有效数字。 (4)对于字符串(s),precision表示最大可输出字符数,不足正常输出,超过则截断。 precision不显示指定,则默认为0 |
* | 以星号代替数值,类似于width中的*,在输出参数列表中指定精度。 |
示例 |
printf("%.8d\n",1000); //不足指定宽度补前导0,效果等同于%06d
printf("%.8f\n",1000.123456789);//超过精度,截断
printf("%.8f\n",1000.123456); //不足精度,补后置0
printf("%.8g\n",1000.123456); //最大有效数字为8位
printf("%.8s\n",“abcdefghij”); //超过指定长度截断
输出
00001000
1000.12345679
1000.12345600
1000.1235
abcdefgh
输出最小宽度(width)
用十进制整数来表示输出的最少位数。若实际位数多于指定的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格
width | 描述 | 示例 |
数值 | 十进制整数 | printf("%6d",1000);输出: 1000 |
* | 星号。还可以控制浮点型数字保留的位数 | printf("%.*f", x, a); x是位数控制 |
标志 | ||
字符 | 名称 | 说明 |
--- | --- | --- |
- | 减号 | 结果左对齐,右边填空格(搭配width)。默认右对齐,左边填空格 |
+ | 加号 | 输出符号(一般都是正号) |
space | 空格 | 输出为正是加上空格,为负加上负号 |
0 | 数字0 | 输出的前面补0,知道占满列宽位置(不可以搭配-使用) |
对于0,举个例子 | ||
| ||
其他的一些操作: | ||
C 语言中常用的多行字符串写法。 | ||
打印马里奥,相邻两个字符串(指”与“之间的,不是'\n')之间没有换行也行。 |
#include<stdio.h>
int main() {
printf(
" ********\n"
" ************\n"
" ####....#.\n"
" #..###.....##....\n"
" ###.......###### ### ###\n"
" ........... #...# #...#\n"
" ##*####### #.#.# #.#.#\n"
" ####*******###### #.#.# #.#.#\n"
" ...#***.****.*###.... #...# #...#\n"
" ....**********##..... ### ###\n"
" ....**** *****....\n"
" #### ####\n"
" ###### ######\n"
"##############################################################\n"
"#...#......#.##...#......#.##...#......#.##------------------#\n"
"###########################################------------------#\n"
"#..#....#....##..#....#....##..#....#....#####################\n"
"########################################## #----------#\n"
"#.....#......##.....#......##.....#......# #----------#\n"
"########################################## #----------#\n"
"#.#..#....#..##.#..#....#..##.#..#....#..# #----------#\n"
"########################################## ############\n"
);
return 0;
}
2 scanf
|格式字符|对应数据类型|含义|
|---|---|---|---|
d|int|输入十进制有符号整数|
f/F/e/E/g/E|float|输入单精度浮点数
上面前面加一个l|double|输入双精度浮点数
c|char|输入字符
s|char*|输出字符串
I64d|long long|输入long long
- bool型的输入用 %d 就好
- 最好格式字符和类型一一对应,绝大部分不对应的情况会出错
- %c不会跳过空格换行制表符,其他都会跳过
- 用scanf给string赋值时,必须声明长度,用例如下。
#include <stdio.h>
#include <string>
using namespace std;
int main()
{
string a;
a.resize(100); //需要预先分配空间
scanf("%s", &a[0]);
puts(a.c_str());
return 0;
}
其他
空白字符
空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符,空白符可以是space,tab,newline等等,直到第一个非空白符出现为止。
非空白字符
一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符。但在输入时必须输入这些字符。否则就会出错。
用于whilewhile(scanf("%d,&n)!=EOF)和while(~scanf("%d",&n)
功能:当读到文件结尾时终止循环
最后
感觉自己写得稀烂,毕竟后面开始烦躁了,等自己正式学的时候进行改造好了。