标准输入输出流的控制符
以下均包含在iomanip头文件
控制符 | 作用 |
---|---|
dec | 设置数字的基数为10 |
hex | 设置数字的基数为16 |
oct | 设置数字的基数为8 |
setfill( c ) | 设置填充字符c,c可以是字符常量或字符变量 |
setprecision(n) | 设置浮点数的精度为n位。在以一般十进制小数形式输出时,n代表有效数字。在以fixed或scientific形式输出时,n代表的是小数位数 |
setw(n) | 设置字段宽度为n |
setiosflags( ios:: fixed ) | 设置浮点数以固定的小数位数显示 |
scetiosflags( ios:: scientific ) | 设置浮点数以科学计数法(即指数形式)显示 |
setiosflags( ios:: left ) | 输出数据左对齐 |
setiosflags( ios:: right ) | 输出数据右对齐 |
setiosflags( ios:: skipws ) | 忽略前导的空格 |
setiosflags( ios:: uppercase ) | 数据以十六进制形式输出时字母以大写形式表示 |
setiosflags( ios:: lowercase ) | 数据以十六进制形式输出时字母以小写形式表示 |
setiosflags( ios:: showpos ) | 输出正数给出‘+’号 |
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
/*输出双精度数*/
double a=123.4567890123;
cout<<a<<endl;
cout<<setprecision(9)<<a<<endl;
cout<<setprecision(5);
cout<<setiosflags(ios::fixed);
cout<<a<<endl;
cout<<setiosflags(ios::scientific)<<setprecision(4)<<a<<endl;
cout<<endl;
return 0;
}
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
/*输出整数*/
int b=123456;
cout<<b<<endl;
cout<<hex<<b<<endl;
cout<<setiosflags(ios::uppercase)<<b<<endl;
cout<<oct<<b<<endl;
cout<<setiosflags(ios::fixed)<<setprecision(3)<<b<<endl;
cout<<setiosflags(ios::scientific)<<setprecision(3)<<b<<endl;
cout<<setfill('*')<<setw(10)<<b<<endl;
cout<<dec<<setiosflags(ios::showpos)<<b<<endl;
return 0;
}
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
/*各行小数点对齐*/
double c=123.456,d=3.14156,e=-3254.543;
cout<<setiosflags(ios::fixed)<<setiosflags(ios::right)<<setprecision(2);
cout<<setw(10)<<c<<endl;
cout<<setw(10)<<d<<endl;
cout<<setw(10)<<e<<endl;
return 0;
}
注
- 舍弃小数时采用四舍五入
- setw(n)只能够对其后一个输入项起作用
- setiosflags(ios::showpos)对十进制的数有效
输出流函数
- cin流:流提取符“>>”从流中提取数据时通常跳过空格,tab,换行符等空白字符
- get函数:
调用形式 a.[无参数的get函数]cin.get():从指定的输入流中提取一个字符(包括空白字符)
b.[有参数的get函数]cin.get(ch):从指定的输入流中提取一个字符,赋给ch
c.[三个参数的get函数]cin.get(字符数组,字符个数,终止字符):从指定输入流中 提取n-1个字符,若提前遇见终止字符,则结束提取
#include <iostream>
using namespace std;
int main(){
char ch;
cout<<"please input a sentense"<<endl;
while((ch=cin.get())!=EOF)
cout.put(ch);
return 0;
}
#include <iostream>
using namespace std;
int main(){
char ch[5];
cout<<"please input a sentense"<<endl;
cin.get(ch,5,'\n');
cout<<ch;
return 0;
}
- getline函数:从输入流中读取一行字符,其用法与带三个参数的get函数类似。
即:cin.getline(字符数组,字符个数n,终止标志字符)
#include <iostream>
using namespace std;
int main(){
char ch[10];
cin.getline(ch,10,'\n');
cout<<ch;
return 0;
}
- getchar:从终端输入一个字符(用法跟get有点像)
#include <iostream>
using namespace std;
int main(){
char ch;
cout<<"please input a sentense"<<endl;
while((ch=getchar())!=EOF)
putchar(ch);
return 0;
}
函数
-
内置函数:指定内置函数的方法:在函数首行的左端加一个关键字inline即可。
注
a.可以在声明与定义函数时同时写inline,也可以只在声明时加inline
b.只有那些规模较小并频繁调用的简单函数,才适合声明为内置函数 -
函数的重载:即对一个函数名重新赋予它新的含义使一个函数名可以多用
注
a.重载函数的参数个数,参数类型或参数顺序三者中,必须至少有一种不同,函数返回值类型可同可不同。
b.同名函数的功能应该相同或相近。
#include <iostream>
using namespace std;
int max(int a,int b);
double max(double a,double b);
int main(){
int a=3,b=4;
cout<<"a="<<a<<"b="<<b<<endl;
cout<<"max="<<max(a,b);
double c=3.14,d=65.21;
cout<<"c="<<c<<"d="<<d<<endl;
cout<<"max="<<max(c,d);
return 0;
}
int max(int a,int b){
return (a>b?a:b);
}
double max(double c,double d){
return (c>d?c:d);
}
- 函数模板的使用:可以简化函数体完全相同,只是形参类型不同重复编程的问题。
实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。
#include <iostream>
using namespace std;
template <typename T>//typename可以换成class
T max(T a,T b){
return (a>b?a:b);
}
int main(){
int a=3,b=4,e;
cout<<"a="<<a<<"b="<<b<<endl;
e=::max(a,b);//原本写的是e=max(a,b),编译的时候调用了函数库里的max函数,所以要用::max(a,b)
cout<<"max="<<e;
double c=3.14,d=65.21,f;
cout<<"c="<<c<<"d="<<d<<endl;
f=::max(c,d);
cout<<"max="<<f;
return 0;
}
- 有默认参数的函数:给形参一个默认值,这样形参就不一定要从实参取值了。
注
a.指定默认值的参数必须放在形参表列的最右端。
b.必须在函数调用之前将默认值的信息通知编译系统。若声明与定义时均给出了默认值,且默认值不同时,以声明的默认值为准(最好只在声明时给出默认值)
c.一个函数不能既作为重载函数,又作为有默认参数的函数。因为在调用函数时,如果少写一个参数,就无法判定到底是利用重载函数还是有默认值的函数。
#include <iostream>
using namespace std;
int max(int a,int b,int c=0);
int main(){
cout<<max(3,4)<<endl;
cout<<max(3,4,5)<<endl;
return 0;
}
int max(int a,int b,int c){
int max=(a>b?a:b);
if(max<c)
max=c;
return max;
}
字符数组
- 定义和初始化字符数组
注
初始化
a.将逐个字符赋给数组中各元素
char c[5]={‘t’,‘w’,‘a’,‘e’,‘c’};
b.用字符串常量来初始化字符数组
char word[5]="gary"字符串常量的最后由系统自动加上一个’\0’,"gary"的长度为5
定义
char c[5];
c={‘c’,‘h’,‘i’,‘n’,‘a’}错误不能对整个数组一次性赋值
c[0]=‘c’,c[1]=‘h’,c[2]=‘i’,c[3]=‘n’,c[4]=‘a’;正确 - 字符数组的输入输出
char str[20];
cin>>str;
cout<<str;
字符串处理函数
- 字符串连接函数strcat
strcat(char [],const char[]);
将第2个字符数组中的字符串连接到前面字符数组的字符串的后面 - 字符串复制函数strcpy
strcpy(char[],const char[]);
将第2个字符数组中的字符串复制到第1个字符数组中去,将第1个字符数组的字符覆盖(就算第一个字符数组的元素多于第二个字符数组的元素,也会全部被覆盖)
注
a.第二个字符数组也可以用字符串常量代替
b.strcpy(str1,str2,2);将第二个字符数组前两个元素复制到str1中,再加一个’\0’ - 字符串比较函数strcmp
if(strcmp(str1,str2)>0)
cout<<"yes";
4.字符串长度函数strlen
strlen(const char []);测的是字符串的实际长度,不包括’\0’
字符串常量
#include < string >
- 赋值:
a.string1=“china” ;
b.string1=string2;
c.string string1=“That”;
string1[2]=‘e’; - 输入输出
cin>>str;
cout<<str; - 复制直接用赋值号(str1=str2)
- 连接直接用+号(str1=str1+str2)
- 比较直接用关系运算符