C语言的输入输出可以指定需要的格式,选择合适的格式保证数据完整性
1、%d 按整型数据的实际长度输出。
2、%md m为指定的输出值的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。
3、%0md 用这种格式时,左端用0来代替空格
4、%-md m为指定的输出值的宽度。如果数据的位数小于m,则右端补以空格,若大于m,则按实际位数输出
5、%ld 输出长整型数据。
输出语句 | 含义 | 输出结果 |
---|---|---|
printf("%6d\n",k); | k的值有4列小于6列,在值的左边补2列空格;如果k的值为12则输出为□□□□12 | □□1234 |
printf("%2d\n",k); | k的值有4列大于2列,不补空格原样输出 | 1234 |
printf("%06d\n",k); | 空格用0替代 | 001234 |
printf("%.6d\n",k); | 空格用0替代 | 001234 |
printf("%-6d\n",k); | 右补空格 | 1234□□ |
1、%f 不指定宽度,整数部分全部输出并输出6位小数。
2、%m.nf 输出共占m列,其中有n位小数,如数值宽度小于m左端补空格。
3、%-m.nf 输出共占m列,其中有n位小数,如数值宽度小于m右端补空格。
输出语句 | 含义 | 输出结果 |
---|---|---|
printf("%12f\n",f); | 输出的宽度为12列,f的值有7列,再加上输出时补的3个0共有10列,小于12列则在值的左边补2列空格 | □□123.456000 |
printf("%12.6f\n",f); | 输出的宽度为12列其中小数要占6列,f的值有7列,再加上输出时补的3个0共有10列,小于12列则在值的左边补2列空格 | □□123.456000 |
printf("%2.6f\n",f); | 输出的宽度为2列其中小数要占6列,f的值有7列,再加上输出时补的3个0共有10列,大于2列则输出时在值的左边不补空格,原样输出 | 123.456000 |
printf("%.6f\n",f); | 小数占6列,不够补0补够6列,值的左边不补空格 ,可以理解为输出的宽度为0列,其中小数占6列。 | 123.456000 |
printf("%12.2f\n",f); | 输出的宽度12列其中小数占2列;f的值共有7列,小数位有3列大于限定的2列则小数位只取2列并对第3位进行四舍五入;那么要输出的值就是123.46,总宽度为6列,则在输出时值的左边就要补6个空格 | □□□□□□123.46 |
printf("%12.0f\n",f); | 输出的宽度为12列其中小数为0列(就是不输出小数,注意四舍五入) | □□□□□□□□□123 |
printf("%.0f\n",f); | 不指定宽度,小数占0列(无小数输出,注意四舍五入) | 123 |
printf("%012.6f\n",f); | 00123.456000 | |
printf("%-12.2f\n",f); | 左对齐右补空格 | 123.46□□□□□□ |
printf("%f%%\n",12.5); | “%%”只输出一个“%” | 12.500000% |
1、%e 数字部分(又称尾数)输出6位小数,指数部分占5位或4位。
2、%m.ne和%-m.ne m、n和”-”字符含义与前相同。此处n指数据的数字部分的小数位数,m表示整个输出数据所占的宽度
输出语句 | 含义 | 输出结果 |
---|---|---|
printf("%e\n",f); | 输出数据的列数大于指定的列数就不补空格了。 | 1.234560e+002 |
printf("%13e\n",f) | 1.234560e+002 | |
printf("%13.8e\n",f); | 1.23456000e+002 | |
printf("%3.8e\n",f); | 1.23456000e+002 | |
printf("%.8e\n",f); | 1.23456000e+002 | |
printf("%13.2e\n",f); | 总宽度小于13列左端补空格,只有2位小数部分 | □□□□1.23e+002 |
printf("%13.0e\n",f); | 没有小数部分 | □□□□□□□1e+002 |
printf("%.0e\n",f); | 1e+002 | |
printf("%013.2e\n",f); | 空格用0替换 | 00001.23e+002 |
printf("%-13.2e\n",f); | 1.23e+002□□□□ |
输出语句 | 含义 | 输出结果 |
---|---|---|
printf("%g\n",f); | 无宽度控制 | 123.456 |
printf("%5g\n",f); | f值的宽度大于指定的宽度,原样输出 | 123.456 |
printf("%10g\n",f); | f值的宽度小于指定的宽度,左端要补空格 | □□□123.456 |
printf("%g\n",123.456789); | 使用%g格式符输出时,仅前7位是有效数字(从第一位非0的数字开始算,7位为有效数字) | 123.457 |
1、%s:例如:printf("%s", “CHINA”)输出"CHINA"字符串(不包括双引号)。
2、%ms:输出的字符串占m列,如字符串本身长度大于m,则突破获m的限制,将字符串全部输出。若串长小于m,则左补空格。
3、%-ms:如果串长小于m,则在m列范围内,字符串向左靠,右补空格。
4、%m.ns:输出占m列,但只取字符串中左端n个字符。这n个字符输出在m列的右侧,左补空格。
5、%-m.ns:其中m、n含义同上,n个字符输出在m列范围的左侧,右补空格。如果n>m,则自动取n值,即保证n个字符正常输出。
输出语句 | 含义 | 输出结果 |
---|---|---|
printf("%s\n",“abedefg”); | abedefg | |
printf("%10s\n",“abedefg”); | □□□abedefg | |
printf("%5s\n",“abedefg”); | 实际输出的列数大于5列就原样输出 | abedefg |
printf("%.5s\n",“abedefg”); | 只输出5列 | abcde |
介绍了这么多的输出格式,下面用具体的程序输出体验一下
#include<stdio.h> int main() { int a, b; float c,d; int e,f; unsigned int u,v; char c1,c2; scanf("%d,%d",&a,&b); scanf("%f,%f",&c,&d); scanf("%d,%d",&e,&f); scanf("%o,%o",&u,&v); scanf("%c,%c",&c1,&c2); printf("\n"); printf("a=%7d,b=%7d\n",a,b); printf("c=%10.2f,b=%10.2f\n",c,d); printf("e=%17d,f=%17d\n",e, f); printf("u=%o,v=%o\n",u,v); printf("c1=%c,c2=%c\n",c1,c2); return 0; }
可以自己尝试编译运行一下 ^ o ^,也可以使用下面的测试数据跑一下
123,456
17.6,1837.65
2147483640,21474836470
62000,58765
a,b
我觉得呢,当输入到f的值时出现了错误,因为输入f的值已经超出了int类型变量的最大值;当以八进制输入v的值时出现了错误,因为v的值的第二位为8,超过了八进制的最大基数7,系统停止给v赋值,转而后面的c1和c2值都出现了问题。
如果一定要用上面的一组数据做测试,该如何进行修改,我们可以做出下面的修改
#include<stdio.h> int main() { int a, b; float c,d; int e; long long f; /*我将f的格式定义为了long long型,这样表示的位数可以更多*/ unsigned int u,v; char c1,c2; scanf("%d,%d",&a,&b); scanf("%f,%f",&c,&d); scanf("%d,%lld",&e,&f); /*这里的输入也需要相应的修改*/ scanf("%o,%d",&u,&v); /*这里以10进制接收v*/ scanf("%c,%c",&c1,&c2); printf("\n"); printf("a=%7d,b=%7d\n",a,b); printf("c=%10.2f,b=%10.2f\n",c,d); printf("e=%17d,f=%17lld\n",e, f); /*这里的输出也需要相应的修改*/ printf("u=%o,v=%d\n",u,v); printf("c1=%c,c2=%c\n",c1,c2); return 0; }
再一次用相同的数据测试:
这里虽然f的值可以正确显示了,并且u也以十进制接收了数据,但是c1和c2的值还是有问题,我觉得c1的值是“回车”,因为在输入完v的值后系统开始接收键盘上敲入的字符,首先敲入了回车然后是a接着是逗号,系统从回车开始接收,自动将回车赋给字符变量c1,将逗号给字符变量c2,因而不能正确显示
我们直接在58765后面键入ab,中间不要用回车和空格
123,456
17.6,1837.65
2147483640,21474836470
62000,58765a,b
执行结果:
这样就可以正确显示c1c2的值了
#include<stdio.h> int main() { int a, b; float c,d; int e; long long f; /*我将f的格式定义为了long long型,这样表示的位数可以更多*/ unsigned int u,v; char c1,c2; scanf("%d,%d",&a,&b); scanf("%f,%f",&c,&d); scanf("%d,%lld",&e,&f); /*这里的输入也需要相应的修改*/ scanf("%o,%d",&u,&v); /*这里以10进制接收v*/ getchar(); scanf("%c,%c",&c1,&c2); printf("\n"); printf("a=%7d,b=%7d\n",a,b); printf("c=%10.2f,b=%10.2f\n",c,d); printf("e=%17d,f=%17lld\n",e, f); /*这里的输出也需要相应的修改*/ printf("u=%o,v=%d\n",u,v); printf("c1=%c,c2=%c\n",c1,c2); return 0; }
我们会发现这样也可以成功输出:
输入完v的值58765后面的回车自动被getchar()接收,从而后面的c1和c2可以接收a和b。也可以先定义一个字符型变量c3,让c3去接收v后面的回车符,后面输出时不输出c3即可。
尝试一下用字符型变量c3代替getchar();去接收v后面的回车符:
#include<stdio.h> int main() { int a, b; float c,d; int e; long long f; /*我将f的格式定义为了long long型,这样表示的位数可以更多*/ unsigned int u,v; char c1,c2,c3; /*c3不要忘了定义*/ scanf("%d,%d",&a,&b); scanf("%f,%f",&c,&d); scanf("%d,%lld",&e,&f); /*这里的输入也需要相应的修改*/ scanf("%o,%d",&u,&v); /*这里以10进制接收v*/ scanf("%c%c,%c",&c3,&c1,&c2); printf("\n"); printf("a=%7d,b=%7d\n",a,b); printf("c=%10.2f,b=%10.2f\n",c,d); printf("e=%17d,f=%17lld\n",e, f); /*这里的输出也需要相应的修改*/ printf("u=%o,v=%d\n",u,v); printf("c1=%c,c2=%c\n",c1,c2); return 0; }
结果也是和上面的一样,这里要注意
scanf("%c%c,%c",&c3,&c1,&c2);
前面的%c后面没有逗号分隔,实现c3接收回车后直接用c1接收a
#include<stdio.h> int main() { int i,j,m,n; i = 8; j = 10; m = ++j; n = j++; printf("%d,%d,%d,%d",i,j,m,n); return 0; }
运行后可以看见输出:8,12,11,11
这里简单解释一下:
首先i的值没有改变,即8,直接输出
进行到m=++j时,j首先自增+1,变成11后赋值给m,所以m=11
进行到n=j++时,j先将11赋值给n,然后自增+1,变成12
最终输出8,12,11,11
#include<stdio.h> int main() { int i,j,m,n; i = 8; j = 10; m = i++; /*改成i++*/ n = ++j; printf("%d,%d,%d,%d",i,j,m,n); return 0; }
运行后可以看见输出:9,11,8,11
进行到m=i++时,i首先将8赋值给m,m变成8,然后i自增+1变成9
进行到n=++j时,j首先自增+1,变成11,然后将11赋值给n,n=11
最终输出9,11,8,11
#include<stdio.h> int main() { int i,j; i = 8; j = 10; printf("%d,%d",i++,j++); return 0; }
运行后可以看见输出:8,10
输出语句从右边开始读取j++,即先将j的值10输出,然后j自增+1
然后读取i++,即先将i的值8输出,然后自增+1
#include<stdio.h> int main() { int i,j; i = 8; j = 10; printf("%d,%d",++i,++j); return 0; }
运行后可以看见输出:9,11
输出语句从右边开始读取++j,即先j自增+1变成11,接着将j的值11输出
然后读取++i,即先i自增+1变成9,接着将i的值9输出
#include<stdio.h> int main() { int i,j; i = 8; j = 10; printf("%d,%d,%d,%d",i,j,i++,j++); return 0; }
运行后可以看见输出:9,11,8,10
首先从右边开始读取j++,j=10,将10输出,接着自增+1,变成11
然后读取i++,i=8,将8输出,接着自增+1,变成9
然后分别输出j和i,此时的i和j都已经自增+1了
最终输出9,11,8,10
相信通过这么多的变化,一定清楚了输入输出以及++运算符的作用
#include <stdio.h> #include <math.h> int main() { int x; double r; /*一定要将r定义为双精度型,保证可以精确显示*/ printf("please input x(1-30000):"); scanf("%d",&x); if(x>=1&&x<=30000) {r=sqrt((9*x-7)/5); printf("the result of r is: %lf\n",r);} else printf("您输入的x值不符合要求,请重新运行输入x的值"); return 0; }
一定要将r定义为双精度型,保证可以精确显示,当我们输入500时,可以成功计算出结果:
当输入数字不在1-30000之间会提示输入错误
定义两个双精度变量price和amount
如:price被赋予8.5;amount 被赋予12.0
输出 : money is XXX.XXX!
提示: 输出的格式符用%lf
#include <stdio.h> int main() { double price,amount,money; printf("请输入单价price和数量amount:\n"); scanf("%lf %lf",&price,&amount); money=price*amount; printf("money is %lf!\n",money); return 0; }
price被赋予8.5;amount 被赋予12.0,执行结果:
还可以对程序进一步改进完善,比如对输入的控制提示等等。。