3.C输入输出


printf/scanf格式字符

考试会给不用记

printf所用的格式字符的种类

格式字符 说明
d, i 带符号的十进制形式整数(正数不带+)
o 八进制无符号形式输出整数(不带前导0)
x, X 十六进制无符号形式输出整数(不带前导0x)
u 十进制无符号形式输出整数
c 以字符形式输出(一个字符)
s 输出字符串
f 以小数形式输出浮点数
e, E 以指数形式输出浮点数
g, G 从f,e中选择宽度较短的形式输出浮点数

printf所用的附加格式字符的种类

附加格式字符 说明
字母l 表示长整型整数,用于d, o, x, u前
字母h 表示短整型整数,用于d, o, x, u前
正整数m 表示输出数据的宽度
正整数.n 对浮点数,表示n位小数
对字符串,表示前n个字符
- 输出左对齐

scanf所用的格式字符的种类

格式字符 说明
d, i 输入带符号的十进制形式整数
o 输入八进制无符号形式整数(不带前导0)
x, X 输入十六进制无符号形式整数(不带前导0x)
u 输入十进制无符号形式整数
c 输入单个字符
s 输入字符串
f 输入小数/指数形式的浮点数
e, E, g, G 同f

scanf所用的附加格式字符的种类

附加格式字符 说明
字母l 输入长整型数,用于d, o, x, u前
输入double型数,用于f, e, g前
h 输入短整型数,用于d, o, x, u前
正整数n 指定输入数据所占的宽度
* 本输入项不赋给相应的变量

printf

  • printf("%d", 'A')是合理的行为,不需要进行强制数据转换
  • 转义符在格式控制表列里是会正常转义的。
  • %d数量和输出表列的数量关系
    • 如果%d(格式符的数量)小于后面输出表列的数量,则忽略输出表内多出来的量
    • 如果%d(格式符的数量)大于后面输出表列的数量,属于未定义行为,输出不确定的值,可能会用0代替没有提供的量来输出
  • printf的返回值的含义是:输出的字符个数
  • 附加控制符l的作用:按照长整型输出数据,%ld:long
  • 附加控制符h的作用:按照短整型输出数据,%hd:short
  • 如果要输出的数据类型与格式控制符的类型不一致,则以格式控制符为准
  • %后面加一个整数:代表这个数据的输出宽度,正数右对齐,负数左对齐
  • %f:将浮点数以十进制的小数形式输出,默认小数点后6位
  • %e:将浮点数以十进制的科学记数法(小写e)形式输出
  • %E:将浮点数以十进制的科学记数法(大写E)形式输出,
  • %e和%E的区别是指数标识符字母e的大小写
  • %g/%G:输出形式为小数形式和科学记数法之间宽度较小的一种,默认使用6位有效数字并去除尾0
  • %g/%G:输出形式的差别为用科学记数法输出时e的大小写
  • 对于double数据,输出时格式符%f和%lf没有区别
  • %后加.+整数:代表用%f和%e方式浮点数的小数点后位数(即使是用e方式输出,也是小数点后位数,不是有效位数),%g方式下的小数点后位数(小数形式)和有效位数(科学记数法),%s方式下代表输出字符串的前多少个字符
  • 想要输出%本身,需要另一个%来转义:%%
  • printf输出字符数组的时候,如果最后没有尾零,为一直输出越界

scanf

  • scanf()函数返回值为正确输入的变量的数量
  • scanf()终止条件4个(%c不是这样):
    1. 回车
    2. 空格
    3. 非法字符
    4. 达到指定宽度
  • 多个输入时,格式控制符间是否有空格不影响正确性
  • 当格式控制表列中有除空格以外的其它字符(逗号,a=等)时,对这些字符的输入方法是要求输入的时候也要包含相同的字符,以相同的方式输入。如果没有按照要求输入,则会输入失败,从和格式控制表列开始不一样的地方以后的东西都留在输入流中待下次读取。
  • %md中的m表示:读取m个宽度来作为输入值,到达设定的总宽度的结束条件优先级低于前面3个(回车空格非法)
  • 结论:%*md*m表示:读取m个宽度并不作为任何输入,直接忽略
  • scanf中, 输入浮点型数据时,%f(float) 和 %lf(double) 有差别,上面printf里没区别
  • %mf/%mlf如果指定了宽度m,则只读取宽度m来作为输入数据
  • %m.nf/%m.nlf如果指定了精度(小数点后的位数),属于未定义行为,发生异常,数据不可信
  • %c只读1个字符
  • 空格、换行(ascii为10)是scanf%c方式的有效输入,但必须注意格式控制表列中有空格,那么这个空格将不会被读入

  • scanf("%s",数组名),按照字符串输入,不能读有空格的字符串,输入多个的时候,空格是分隔符,数组最后有尾0,没有换行符。超出长度会越界报错

putchar()/getchar()/_getche()/_getch()

  • putchar()往屏幕上输出单个字符。
  • getchar()输入单个字符,可以输入空格、回车、但还是不能处理转义符。
  • getchar()有回显(可以看到自己输入了什么),会等待回车键。_getche()有回显(e是echo的意思),但不等回车键立刻读取。_getch()没有回显,不等回车键直接读取。gcc里面这个下划线可以不要
  • getchar()putchar()返回值是这个字符ascii码的int。
  • 使用putchar()getchar()有时需要加cstdio或者stdio.h头文件。目前的msvc和gcc都不需要。
  • getchar()putchar()不返回char,而是int。为什么呢?因为除了要表示256个ASCII字符,还要表示出错的值,超出一个字节能表示的范围。为什么不用short用int?因为就类似于之前看到的,用float进行计算反而比double慢,用short也是比int慢,所以就直接上升到int类型。
  • 使用_getche()_getch()需要conio.h
  • _getch()获取键值的时候,部分特殊键(上下左右箭头,insert delete等)都是回传2个值,且第一个是224(char的-32).
  • enter按下后,
    • getchar()获取的是换行’\n’(10)
    • _getch()/_getche()获取的是回车’\r’(13)

gets()

vs:gets_s(s)
gcc:gets(s)
可以获取带空格字符串,超出长度会越界报错
不会把’\n’输进来

fgets()

都可以使用fgets(a,数字,stdin)来输入带空格字符串,超出长度会越界报错
数字代表包含加上尾0最多搞多少字符
会把’\n’输进来

sprintf()/sscanf()

和scanf()和printf()特性一致,但是是以字符数组作为输入输出目标。在原有的语法的基础上,参数第一个位置加字符数组名。其他都一样。这两个函数不对字符数组越界什么的做边界检查,要小心。