-
1、c语言输入输出格式控制
-
(1)输入格式控制–scanf()
语法:#include <stdio.h> int scanf( const char *format, ... );
scanf()函数根据由format(格式)指定的格式从stdin(标准输入)读取,并保存数据到其它参数. 它和printf()有点类似. format(格式)字符串由控制字符,空白字符和非空白字符组成. 控制字符以一个%符号开始,如下:
控制字符 说明 %c 一个单一的字符 %d 一个十进制整数 %i 一个整数 %e, %f, %g 一个浮点数 %o 一个八进制数 %s 一个字符串 %x 一个十六进制数 %p 一个指针 %n 一个等于读取字符数量的整数 %u 一个无符号整数 %[] 一个字符集 %% 一个精度符号 scanf()读取匹配format(格式)字符串的输入. 当读取到一个控制字符, 它把值放置到下一个变量. 空白(tabs, 空格等等)会跳过. 非空白字符和输入匹配, 然后丢弃. 如果是一个在%符号和控制符间的数量, 那么只有指定数量的字符转换到变量中. 如果scanf()遇到一个字符集(用%[]控制字符表示), 那么在括号中的任意字符都会读取到变量中. scanf()的返回值是成功赋值的变量数量, 发生错误时返回EOF.
一些简单的测试数据:#include<stdio.h> int main () { int a; char c; char str[100]; scanf("%d",&a); //输入整数a printf("%d\n",a); //输出整数a //清空缓存区,主要清除换行的影响,防止下一个输入会接收换行符 fflush(stdin); scanf("%c",&c); //输入字符c printf("%c\n",c); //输出字符c fflush(stdin); scanf("%s",str); //输入字符串str printf("%s",str); }
#include<stdio.h> int main () { int a; char c; char str[100]; scanf("%d%c%s",&a,&c,str); //这里c会接收一个回车字符 或者空格,根据输入形式决定 scanf("%s",s); printf("%d %d %s\n",a,c,str); printf("%s",s); }
总之用scanf()接收字符问题很多…
这里有一个详细介绍scanf函数及其常见问题的博客,参考一下。
(2)输出格式控制–printf()
语法:#include <stdio.h> int printf( const char *format, ... );
printf()函数根据format(格式)给出的格式打印输出到STDOUT(标准输出)和其它参数中.
字符串format(格式)由两类项目组成 - 显示到屏幕上的字符和定义printf()显示的其它参数. 基本上, 你可以指定一个包含文本在内的format(格式)字符串,也可以是映射到printf()其它参数的”特殊”字符. 例如本代码
char name[20] = "Bob"; int age = 21; printf( "Hello %s, you are %d years old\n", name, age );
Code 格式 %c 字符 %d 带符号整数 %i 带符号整数 %e 科学计数法, 使用小写”e” %E 科学计数法, 使用大写”E” %f 浮点数 %g 使用%e或%f中较短的一个 %G 使用%E或%f中较短的一个 %o 八进制 %s 一串字符 %u 无符号整数 %x 无符号十六进制数, 用小写字母 %X 无符号十六进制数, 用大写字母 %p 一个指针 %n 参数应该是一个指向一个整数的指针指向的是字符数放置的位置 %% 一个’%’符号 对于浮点数精度控制也相比c++更为方便
#include<stdio.h> using namespace std; int main () { double a=3.141592654; printf("%.4f",a); //输出小数点后4位 return 0; } /* 结果: 3.1416 */
这个printf相比,若cout输出比较大的double数,会用科学计数法显示。
#include<iostream> using namespace std; int main () { double x=48787844545.265989; cout<<x; return 0; } /* 结果: 4.87878e+010 */
2、c++输入输出格式控制
-
(1)输入格式控制–cin
#include<iostream> using namespace std; int main () { int a; char c; char str[100]; cin>>a>>c>>str; cout<<a<<endl<<c<<endl<<str<<endl; return 0; } /* 输入: 1212 a good 输出: 1212 a good */
从输入输出结果来看,cin输入数据会自动忽略掉所有的空格、换行和回车,而自动匹配相应的字符和数字。这一点要比sprintf要简单和实用很多。
(2)输出格式控制–cout
一般情况下的输出:#include<iostream> using namespace std; int main () { int a=666; char c='A'; string str="good day!"; cout<<a<<endl<<c<<endl<<str<<endl; return 0; }
写了这么多东西,终于写到真正想写的东西了!!!!接下来才是重点!!!!
控制浮点数的输出格式:#include<iostream> #include<iomanip> //使用setiosflags所用头文件 using namespace std; int main() { int a=15; double x=456789.123456789; double y=3456789.123456; double z=123.45678; //c++流的默认有效位数是六位 cout<<"x=456789.123456789 \t输出-> \tx="<<x<<endl; cout<<"y=3456789.123456 \t输出-> \ty="<<y<<endl; cout<<"z=123.45678 \t\t输出-> \tz="<<z<<endl; //整数位超过六位用科学计数法表示,整数位+小数位超过六位,其余小数采用四舍五入法舍去 cout<<endl<<"原值:x=456789.123456789"<<endl; cout<<setiosflags(ios::fixed); //设置一次,往下均可使用 cout<<"setiosflags(ios::fixed):"<<endl; cout<<"x=\t"<<x<<endl; //输出精度为小数点后1位 cout<<"setprecision(1):"<<endl; cout<<setprecision(1)<<"\tx="<<x<<endl<<endl; //小数点后2位 cout<<"setprecision(2):"<<endl; cout<<setprecision(2)<<"\tx="<<x<<endl; cout<<"\tx="<<x<<endl<<endl; //3位 cout<<"setprecision(3):"<<endl; cout<<setprecision(3); cout<<"\tx="<<x<<endl; cout<<"\tx="<<x<<endl<<endl; //4位 cout<<"setprecision(4):"<<endl; cout<<setprecision(4); cout<<"\tx="<<x<<endl; return 0; }
解释一下:
setiosflags()是包含在命名空间iomanip中的C++操作符,该操作符的作用是执行由有参数指定区域内的动作;
iso::fixed 是操作符setiosflags的参数之一,该参数指定的动作是以带小数点的形式表示浮点数,并且在允许的精度范围内尽可能的把数字移向小数点右侧;c++最大精度可以表示到小数点后六位。
设定setiosflags(ios::fixed)后,在接下来的输出语句中不需要再次设置,默认按照该格式输出
setprecision 也是包含在命名空间iomanip中的C++操作符,该操作符的作用是设定浮点数;
setprecision(2),就是输出小数点后2位,前提是已经设定setiosflags(ios::fixed)。如果未设定,则setprecision(n)就是设定输出的有效位数。
由于c++默认的输出流有效位为六位,所以当一些数需要保持特定的输出时,上述操作符就变得相当有用。—-重点结束分割线—–
setiosflags()还有一些其他的参数,不再详细解释,附上参数表和一些自己的测试代码。
操作符 说明 dec 基数为10,相当于”%d” hex 基数为16,相当于”%X” oct 基数为8,相当于”%o” setfill(c) 填充字符为c setprecision(n) 设显示小数精度为n位 setw(n) 设置域宽为n个字符 setioflags(ios::fixed) 固定的浮点显示 setioflags(ios::scientific) 科学计数法表示(指数表示) setiosflags(ios::left) 左对齐 setiosflags(ios::right) 右对齐 setiosflags(ios::skipws) 忽略前导空白 setiosflags(ios::uppercase) 16进制数大写输出 setiosflags(ios::lowercase) 16进制小写输出 setiosflags(ios::showpoint) 强制显示小数点 setiosflags(ios::showpos) 强制显示符号 输出整数的十六进制表示
#include<iostream> #include<iomanip> using namespace std; int main() { cout<<hex<<10<<endl; cout <<setiosflags (ios::showbase | ios::uppercase); cout<<10<<endl; return 0; }
setfill(c)和setw(n)
#include<iostream> #include<iomanip> using namespace std; int main() { cout<<'a'<<setw(10)<<'z'<<endl; //a-z之间9个空格 cout<<setfill('*')<<setw(10)<<"x"<<endl; return 0; }
a与z之间有9个空格,setw()只对其后面紧跟的输出产生作用,如上例中,表示’z’共占89个位置,不足的用空格填充。若输入的内容超过setw()设置的长度,则按实际长度输出。
setw()默认填充的内容为空格,可以setfill()配合使用设置其他字符填充。setioflags(ios::scientific)
#include<iostream> #include<iomanip> using namespace std; int main() { double x=123; cout<<x<<endl; cout<<setiosflags(ios::scientific)<<x<<endl; return 0; }
setiosflags(ios::showpoint)
#include<iostream> #include<iomanip> using namespace std; int main() { float x=1234; float y=-255; cout<<setiosflags(ios::showpoint); cout<<x<<endl<<y<<endl; return 0; }
setiosflags(ios::showpos)
#include<iostream> #include<iomanip> using namespace std; int main() { int x=1234; int y=-255; cout<<setiosflags(ios::showpos); cout<<x<<endl<<y<<endl; return 0; }