char* 变量的输出
如果我们直接输出char* 变量 如下所示
int main()
{
char a = '?';
char* b = &a;
char* c = new char[10]{ "dawhi" };
cout << b << endl;
cout << c << endl;
}
我们所输出的并不是一个地址 而是其指向的实际内容
那么如何输出地址呢?
using namespace std;
int main()
{
char a = '?';
char* b = &a;
char* c = new char[10]{ "dawhi" };
void* d = b;
void* e = c;
char* f = reinterpret_cast<char*>(e);
cout <<hex<< b << endl;
cout <<hex<< c << endl;
cout <<hex<< d << endl;
cout <<hex<< e << endl;
cout <<hex<< f << endl;
}
put函数
cout.put(65);
输出对象为A
输入流
输入流cin 流提取运算符 >> 默认跳过输入流中的空白字符
get
get函数使用示例:(get函数可以读取空格)
int main()
{
char a;
while ((a = cin.get()) != EOF)
{
cout << a;
}
}
int main()
{
//char a;
char a[40];
cin.get(a, 30, '\n'); //此处可以设置截断符号 且截断符号不会被读入
cout << a << endl;
}
要注意的是 上述操作截断符号不会被读入字符输出而是保留在输入流之内
如果要清除输入流内内容 可采用cin.ignore() 的方式
getline
getline和get最大的区别在于getline丢弃分隔符 而不是保留在输入流之中
int main()
{
char b;
char a[40];
cin.getline(a, 30, '\n');
cout << a << endl;
b = cin.get();
cout << b << endl;
}
上述程序如果是get函数 那么输入一行字符后程序会自动结束 而getline不会 因为输入流中的换行已经被丢弃 程序等待用户为b输入字符
使用read write 和 gcount
read write是非格式化的输入输出
示例:
using namespace std;
int main()
{
char a[50];
cin.read(a, 40);
cout.write(a, cin.gcount());
}
这里关于gcount我有一点想要补充
如果使用getline读入字符 getline会自动补充换行符 如果输入流字符数量大于读入的字符数量 那么gcount不会对自动补充的换行符进行+1操作
如果输入流字符数量小于等于读入的字符数量 则会+1
不理解也可以 我猜不考
int main()
{
char a[10];
cin.getline(a, 10); //输入"1234067890"
cout << a << endl; //输出"123456789"
cout << cin.gcount(); //输出9
cin.getline(a, 10); //输入"1234067890"
cout << cin.gcount(); //输出9
}
流操作符
流操作符 hex oct dec 以及setbase函数设置的进制都是粘性的
也就是设置一次之后你不改回来就会一直保持该进制输出
precision设置方法同样有两种
如下所是:
int main()
{
double a = 100;
double b = 100;
cout <<fixed<< setprecision(6) << a << endl;
cout.precision(5);
cout <<fixed<< a << endl;
}
同时可借助
int d = cout.precision();
cout << d << endl;
来获取原来的/现在的设置
宽度: width 和setw 要注意这两个不是黏性设置
自定义输出流操作符
using namespace std;
ostream& nmhl(ostream& c)
{
c << "nmsl" << endl;
return c;
}
int main()
{
cout << nmhl << endl;
}
showpoint
流操作符 showpoint
强制要求浮点数输出小数点和尾数0 且精度设置为6
此处的精度并非指的时小数点后位数 而是包括整数部分
当我们不使用fixed和scientific运算符号时 我们设置setprecision只能设置显示的有效位数而不是小数点的有效位数
int main()
{
double a = 54.01200;
cout << a << endl;
cout << showpoint << a << endl;
cout << showpoint << setprecision(10) << a << endl;
cout << fixed << a << endl;
}
测试结果

showpos internal left right showbase
没什么好讲的 showpos显示符号 internal会将符号左对齐 数字右对齐
显示八进制 十六进制基数
uppercase
大写 小写控制 可以在输出十六进制整数和科学计数法的时候强制X E为大写
boolalpha
强制bool型变量按照 true false格式输出
通过成员函数flags设置和重制格式状态
通过ios_base fmtflags A=cout.flags();来获取当前flag状态
测 试 题
通过flags函数可以设置和重置输出格式状态
头文件<iostream>包含了所需要的I/O操作符
使用参数化的流操作符 必须包括<iomanip>
流插入运算符 <<
流提取运算符 >>
系统支持的四个标准设备对象是 cout cin cerr clog
showpos要求显示加号
cerr的输出是无缓冲的 clog的输出是有缓冲的
uppercase
cout<<""dawhdiwa""<<endl 该语句无法正常执行 必须使用转义字符‘\’
最近确实很怠惰 也不怎么想学了 唉
13.14 流提取运算符
为了给大伙演示一下这玩意是怎么用的 我这里仅仅做示范
#include<iostream>
#include<iomanip>
#include<string>
#include<fstream>
#include<cmath>
#include<vector>
#include<stack>
#include<cstdio>
#include<array>
#include<vector>
#include<map>
using namespace std;
class A
{
friend istream& operator >>(istream& cin, A& ac);
public:
string num1;
string num2;
string num3;
void cou()
{
cout << num1 << endl;
cout << num2 << endl;
cout << num3 << endl;
}
};
istream& operator >>(istream& cin, A& ac)
{
char a[14];
cin.getline(a, 14);
if (cin.gcount() != 14)
{
cout << '1' << endl;
cin.clear(ios::failbit);
}
if (a[1] == '0' || a[1] == '1')
{
cout << '2' << endl;
cin.clear(ios::failbit);
}
if (a[2] != '1' && a[2] != '0')
{
cout << '3' << endl;
cin.clear(ios::failbit);
}
if (cin.fail() != 1)
{
string num = a;
ac.num1 = num.substr(1, 3);
ac.num2 = num.substr(5, 3);
ac.num3 = num.substr(9, 4);
return cin;
}
else {
cout << "输入数据存在问题";
cout << "程序结束";
return cin;
}
}
int main()
{
A as;
if ((cin >> as).fail())
{
return 0;
}
else
{
as.cou();
}
}
因为我前面已经提到过getline读入字符大于指定字符数量时 计数比原来少1的事情
当然你觉得太玄学 你也可以使用getline(cin,a) (a设置为string) 然后判断a的长度
13.17 打印Ascil列表
int main()
{
for (int i = 33; i < 126; i++)
{
char a=i;
cout<<right <<setw(4) <<a << dec << setw(4) << i << oct << setw(4) << i << setw(4) << hex << i << endl;
}
}