一、cin的>>运算符重载
cin的>>运算符重载有个缺陷,则是遇到空格,tab键,回车都会当做结束符,举个例子:
#include<iostream>
using namespace std;
int main() {
char buf[1024];
cin >> buf;
cout << buf << endl;
system("pause");
return 0;
}
输出结果:
可以看到遇到空格就不往buf中读了,虽然cin>>输入很方便,但这个问题就是cin的>>运算符重载的严重缺陷。因此就引入了cin的成员函数。
二、cin的get成员函数
1、cin.get(char &)
#include<iostream>
using namespace std;
int main() {
char ch;
while (cin.get(ch), !cin.eof()) {
cout.put(ch);
}
system("pause");
return 0;
}
输出结果:
可以看到get函数可以把空格,\t和回车都读入,如果输入一串字符串,最后以ctrl+z结束,仍然会显示在屏幕上,因为会把ctrl+z转换成另一种字符,只有单独输入ctrl+z时,通过cin.eof()判断出是结束符表示结束。跳出循环。
2、cin.get()
#include<iostream>
using namespace std;
int main() {
char ch;
while (ch = cin.get(), !cin.eof()) {
cout.put(ch);
}
system("pause");
return 0;
}
输出结果:
cin.get()和cin.get(char&)这两个函数是相似的。
3、cin.get(char *, int)
#include<iostream>
using namespace std;
int main() {
char buf[10];
cin.get(buf, 1024);
cout << buf << endl;
system("pause");
return 0;
}
但通过键盘输入时,最多可以读9个字节到buf字符串中,最后一个是’\0’,空格,\t都可以读入,若输入超过9个字节,则只读入9个字节到buf中。
输出结果:
123后面是个tab,\t表示一个字符。
4、cin.get(char* , int ,char)
#include<iostream>
#include<string.h>
using namespace std;
int main() {
char buf[1024];
cin.get(buf, 10, 'i');
cout << buf << endl;
memset(buf, 0, sizeof(buf));
cin.get(buf, 10, 'i');
cout << "---" << buf << endl;
system("pause");
return 0;
}
输出结果:
cin.get(buf, 10, 'i');
这句是说超出9个字节或者遇到字母i则停止读入到buf中,字母i不会读入到buf中。
可以看到第二个buf什么也没有输出,说明在第二次get函数调用时,没有跳过字母i,再次遇到字母i,此时buf里面什么都没读入。这里用cin.ignore()函数进行跳过:
#include<iostream>
#include<string.h>
using namespace std;
int main() {
char buf[1024];
cin.get(buf, 10, 'i');
cout << buf << endl;
memset(buf, 0, sizeof(buf));
cin.ignore(1);
cin.get(buf, 10, 'i');
cout << "---" << buf << endl;
system("pause");
return 0;
}
输出结果:
可以看到第二次buf成功输出了,为什么第一次回车之后第二次的buf没有立马输出呢,因为达到get的要求,要么buf可以读入9个字节,要么到达了字母i,这两个条件都没有满足,系统就等待继续输入,最后输入够9个字节,可以看到回车符也被读入到了buf中,最终输出。