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,举个例子

printf("%06d",1000);输出:001000

其他的一些操作:

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()函数在读入时剔除掉与这个非空白字符相同的字符。但在输入时必须输入这些字符。否则就会出错。
用于while
while(scanf("%d,&n)!=EOF)和while(~scanf("%d",&n) 功能:当读到文件结尾时终止循环

最后

感觉自己写得稀烂,毕竟后面开始烦躁了,等自己正式学的时候进行改造好了。