1. 原始cin输入字符
如果程序要使用循环输入来自键盘的文本,则必须设置哨兵字符作为停止标记。
#include <iostream>
using namespace std;
int main() {
char c;
int count = 0;
cout << "Enter characters; enter # to quit:\n";
cin >> c;
while (c != '#') {
cout << c;
count++;
cin >> c;
}
cout << endl;
cout << count << " characters read\n";
return 0;
}
下面是该程序的运行情况:
Enter characters; enter # to quit:
I love china#
Ilovechina
10 characters read
这说明cin将忽略空格和换行符,因此输入中的空格没有回显,也没有被包括在计数内。更为复杂的是,发送给cin的输入被缓冲,这意味着只有用户按下回车键后,输入的内容才被发送给程序。(没有输入一个字符,随即输出一个字符),为了正确读取字符串中的空格,可以采用cin.get(char)函数
2. cin.get(char)输入字符
成员函数cin.get(char)读取输入中的每一个字符(即使是空格),并将其赋值给c。
#include <iostream>
using namespace std;
int main() {
char c;
int count = 0;
cout << "Enter characters; enter # to quit:\n";
cin.get(c);
while (c != '#') {
cout << c;
count++;
cin.get(c);
}
cout << endl;
cout << count << " characters read\n";
return 0;
}
下面是该程序的运行情况:
Enter characters; enter # to quit:
I love china#
I love china
12 characters read
对于上述两种输入方式都是单字符输入,有时为了输入字符串也可以利用cin方法
3. 原始cin输入字符串
#include <iostream>
#include<string>
#define Arsize 20
using namespace std;
int main() {
char name[Arsize];
char dessert[Arsize];
cout << "Enter your name:\n";
cin >> name;
cout << "Enter your favorite dessert:\n";
cin >> dessert;
cout << "I have some delicious " << dessert;
cout << " for you, " << name << ".\n";
return 0;
}
下面是该程序的运行情况:
Enter your name:
Alistair Dreeb
Enter your favorite dessert:
I have some delicious Dreeb for you, Alistair.
从上述结果中可以看到cin输入字符串时,将空格符设置为结束符,导致程序中都无须输入第二个字符串程序就往下运行了,有时为了准确输入含有空格的字符串可以采用cin.get(*char, int)函数
4. cin.get()的重载函数
cin.get()函数还有一个重载的版本接受两个参数:数组名和数组的长度
#include <iostream>
#include<string>
#define Arsize 20
using namespace std;
int main() {
char name[Arsize];
char dessert[Arsize];
cout << "Enter your name:\n";
cin.get(name, Arsize).get();
cout << "Enter your favorite dessert:\n";
cin.get(dessert, Arsize).get();
cout << "I have some delicious ";
cout << " for you, " << name << ".\n";
return 0;
}
下面是该程序的运行情况:
Enter your name:
xiao ming
Enter your favorite dessert:
pizza
I have some delicious pizza for you, xiao ming.
上述程序中函数cin.get(*char, int)可以准确读取含有空格的字符串,但是每行的结束符[回车换行符]依然留在输入流中,为了保证后续的正确读取,需要跳过每行的结束符,其中cin.get(*char, int)的返回值为cin对象为了读取换行符在该函数后直接添加了.get()方法,为读取下一行做准备。
5. cin.getline()函数
#include <iostream>
#include<string>
#define Arsize 20
using namespace std;
int main() {
char name[Arsize];
char dessert[Arsize];
cout << "Enter your name:\n";
cin.getline(name, Arsize);
cout << "Enter your favorite dessert:\n";
cin.getline(dessert, Arsize);
cout << "I have some delicious " << dessert;
cout << " for you, " << name << ".\n";
return 0;
}
下面是该程序的运行情况:
Enter your name:
Mai Parfait
Enter your favorite dessert:
Chocolate Mousse
I have some delicious Chocolate Mousse for you, Mai Parfait.
cin.getline(*char, int)函数含有两个参数,其与cin.get(*char, int)最大的区别就是cin.getline()会读取每行的结束符[回车换行符],而cin.get()不会读取每行的结束符,因此cin.getline()在某些情况下更简洁。
使用string类输入
#include <iostream>
#include<string>
using namespace std;
int main() {
string name;
string dessert;
cout << "Enter your name:\n";
cin >> name;
cout << "Enter your favorite dessert:\n";
cin >> dessert;
cout << "I have some delicious " << dessert;
cout << " for you, " << name << ".\n";
return 0;
}
下面是该程序的运行情况:
Enter your name:
Alistair Dreeb
Enter your favorite dessert:
I have some delicious Dreeb for you, Alistair.
从运行结果可知在输入含有空格的字符串时,用字符数组和string类是一样的效果。为了实现含有空格的输入可以采用getline(cin, string)实现。
上述总结了几种输入方式,便于自己记忆和复习,大部分内容来自于C++ primer plus第六版。