C/C++标准输入输出格式控制

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;
 }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值