【标准输入函数格式】
基本格式字符:%d:有符号十进制整数;%u无符号十进制整数;%c单个字符;%s字符串(字符存放到数组+结束位);%e实数;。
--------------------------------------------------------------------------------------------------------------------
1.scanf("%d%d%d",&a,&b,&c);
格式化符【无间隔/有空格隔开/有Tab隔开/\n隔开】时,输入的数据之间都可以使用空格/Tab缩进/Enter来充当字符之间的分隔符
注:不能使用逗号以及其他符号如3,4,5来进行输入
2.scanf("%d,%d,%d",&a,&b,&c);
格式化输入控制符之间有【逗号/分号/其他非空符号】,隔开,则在输入的时候只能采用与格式控制时相同的字符,否则输入3 4 5回车显示3,-9XXXXX ,-9XXXXX,即只能准确获得第一个数值。
3.scanf("%c,%c,%c",&a,&b,&c);
如果我们输出的是a b c,得到的结果是:[a=a,b=?,c= ]; a b c
如果我们输出的是a,b c,得到的结果是:[a=a,b=b,c= ];
如果我们输出的是a,b,c,得到的结果是:[a=a,b=b,c=c]
比较第一第三可知输入的时候[,]这个格式字符并不算字符;比较第二第三可知在字符输入的时候,空格是占了一个字符的!。那么我们来看看空格当作格式字符的时候算字符么
scanf("%c %c %c",&a,&b,&c);如果我们输入[a b c]中间有两个空格的时候,输出的是[a=a,b=b,c=c]
反复验证后得知:当输出的格式字符为两个%c一起时,如果%c之间【无间隔】,则输入数据时空格/Tab/\n都当作空格输出;如果有间隔则满足%d格式字符的所有表现;如果混合字符时???
【混合输入】scanf("%d%c%d");此时%c必输出空格;(P58有问题);
scanf("%d,%c,%d");此时%c输入符号则结果为符号,不是符号结果为0;
scanf("%d %c %d");此时%c同%d的输出;
4.在输入%f时,遇到空格、回车、Tab或者非法输入时,编译器认为该数据结束。
5.对于unsigned类型变量可用%u格式输入。
--------------------------------------------------------------------------------------------------------------------
【总结:Scanf输入数据的时候,按照格式控制位的顺序依次给对应的变量赋值,如果格式位应有的格式与控制台输入的不同,编译器从非法的地方开始结束;如果当前格式位的格式不是%c,遇到空格、回车、Tab时就开始进行下一个赋值;如果是%c就把这个当作空格字符;如果遇到规定格式就必须按照规定的格式书写】
--------------------------------------------------------------------------------------------------------------------
【输入输出格式控制】通过附加格式说明符
[输出]
1.%md。这个m指定输出数据的宽度,小于宽度在左侧补空格(右对齐),大于等于宽度正常输出(左对齐)。
2.%od。将当前格式按照8进制输出。
3.%x。以16进制数输出整数,不会出现负数。
4.%u。用来输出无符号数,有符号数和无符号数在合法区间内可以相互转换。
5.%mc。用来指定输出字符宽度,同%md。
6.%ms。指定输出字符串列数,同%md。
%-ms。长度小于m,左对齐;大于等于m,左对齐。
%m.ns。小于m右对齐,大于m左对齐,只取n列。
%-m.ns。左对齐,列数大于n取出左侧n列,小于n增加列数只到=n。
[总结:-ms一定左对齐,ms一定右对齐,m是指输出的列数,n是指从左到右截取的列数]
7.%m.nf。m指定输出实数列数,n指定该实数小数的位数,其他与上面的相同。
[输入]
1.%md。指定输入数据所占列数,编译系统自动截取所需数据。
2.%*md。指定截取时先要跳过的列数,如scanf("%3d %*2d %2d",&a,&b,&c); 若输入123456789,则a=123,b=67,c=89。