为进入独立解决问题的复合结构程序设计,还需要掌握格式化输入输出的技巧。
C语言的格式化输入输出
1、printf 和 scanf (包含头文件 stdio.h)
语法:这两个函数的实参(括号内)包括两个部分:格式控制字符串 + 输出(输入)项,其中输出(输入)项可以有多个或者没有,需要与前面的格式控制字符串进行对应。格式控制字符串的标识是一对双引号 "......" (字符串),它由三种成分组成:格式控制字符(%开头)、转义字符(\开头),其他普通字符,格式控制字符与输出(输入)项应该个数相同、类型相同、顺序相同;转义字符则按照转义字符的特定含义来输出(输入),普通字符则按原样输出(输入)。
注意,此处的输出是在程序运行的控制台窗口显示,输入则是通过键盘完成输入。
双引号中sum=都是普通字符,原样输出;
%d(int) 与后面的输出项sum对应(个数、类型、顺序)输出的时候用sum的值去代替%d的地方;
\n 是转义字符,不再是普通的n,而是一个换行符。
格式化输入函数scanf的语法与printf类似:
scanf( “格式控制串”, 地址项 )
注意点:
1、printf的输出项变成了输入项(地址项),所谓的地址项就是在变量的前面加"&"
2、printf的输出项可以是普通变量、常量、表达式、函数调用等,而scanf函数的输入项只能是变量的地址(还是数组地址等)
3、在printf函数中经常用普通字符和转义字符来实现对输出格式的控制,但scanf函数则很少用到普通字符和转义字符,如果一定要用,规则就是得 “照原样输入”,有一个特殊的符号 “," ,在scanf函数中可能经常使用,来实现多个输入项的分割。当然也必须得按原样输入的规则。
看代码:
在VS2012中报安全检测的错误,解决方案,直接定义宏_CRT_SECURE_NO_WARNINGS
1、scanf格式控制字符串,两个 %d 与后面的输入项a,b对应,中间没有空格。 则输入的时候利用空格、换行、TAB进行分割(输入a后空格,输入b);也可以是逗号 ”%d,%d",那么需要用逗号分割。
2、scanf("%d %d",&a,&b);两个%d之间多个空格在输入的时候不需要输入多个空格,一个空格或者换行、TAB就可以;
3、printf函数中有三个%d,分别与 a 、b 、a+b三个输出项对应,输出的时候会用它们的值来代替,如上图的3、4、7; 空格、+、= 都是普通字符,原样输出;\n 则是转义字符,换行。
格式化输出输入
格式控制字符:
1、%d %i 在printf输出没有区别,scanf则略有区别,%d用于十进制,%i则可以完成八进制、十六进制的输入(自动匹配)
2、十六进制八进制只能实现无符号整数的输入输出,十六进制可以大小字母"x",八进制只能是小写的字母"o" :
3、无符号的u输出负数会是很大的值,因为它把符号位也看成了数值:
4、%s可以对字符串进行输入输出,由于没有字符串变量,scanf没办法完成输入(后面字符数组、字符指针可以完成输入);
5、float类型用%f,double类型用%lf (long的第一个字母),输入double的时候一定要%lf,输出double用%f 基本上没有错误(其实就是类型转换了),%f %lf 默认输出6位小数(不包括小数点)
控制输出输入位数的 m n + -
在整型、字符类型输出的时候,可以在格式控制字符中可以带+、-、m来控制输出输入,浮点数类型则还可以跟n,语法: % (+/-) m.n 格式控制字符
整数的输入出:
scanf用%5d限制输入,输入123456截断成12345,不够的话没有影响;printf输出 %15d,输出内容不够15位补空格, 省略或者+在左边(前面)补空格,负号则在右边(后面)补空格
多个输入则有可能影响后面:
前面不超过指定位数,不会对后面的输入有影响:
字符类型的输入输出、八进制十六进制的输入输出可以参考以上
浮点数的输入输出:
至于printf中%15.2f的小数部分,则是表示,保留多少位小数
1、在正常输入情况下,保留2位小数输出会进行四舍五入;
2、在截断输入情况下,不会进行四舍五入;
3、浮点数是有精度的,输入 3.8,输出的时候是3.79999995,正好证明了这点。