程序中往往需要一些交互操作,如果想获取从键盘输入的字符串,可以使用多种方法。
使用输入操作符读取单词
标准库中提供了iostream
,可以使用内置的cin
对象,调用重载的输入操作符>>
来读取键盘输入。
string str;
// 读取键盘输入,遇到空白符停止
cin >> str;
cout << str;
这种方式的特点是:忽略开始的空白符,遇到下一个空白符(空格、回车、制表等)就会停止。
所以如果输入“hello world”,那么读取给str的只有“hello”:这相当于读取了一个“单词”。
剩下的内容“world”其实也没有丢,而是保存在了输入流的“输入队列”里。如果想读取更多的输入信息,就需要使用更多的string对象来获取:
string str1, str2;
cin >> str1 >> str2;
cout << str1 << str2 << endl;
这样,如果输入“hello world”,就可以输出“helloworld”。
使用getline读取一行
如果希望直接读取一整行输入信息,可以使用getline函数来替代输入操作符。
string str3;
getline(cin, str3);
cout << "str3 = " << str3 << endl;
getline函数有两个参数:一个是输入流对象cin
,另一个是保存字符串的string
对象;它会一直读取输入流中的内容,直到遇到换行符为止,然后把所有内容保存到string对象中。所以可以完整读取一整行信息。
使用get读取字符
还有一种方法,是调用cin的get
函数读取一个字符。
char ch;
ch = cin.get(); // 将捕获到的字符赋值给ch
cin.get(ch); // 直接将ch作为参数传给get
有两种方式:
- 调用cin.get()函数,不传参数,得到一个字符赋给char类型变量;
- 将char类型变量作为参数传入,将捕获的字符赋值给它,返回的是istream对象
get函数还可以读取一行内容。这种方式跟getline很相似,也可以读取一整行内容,以回车结束。主要区别在于,它需要把信息保存在一个char[]
类型的字符数组中,调用的是cin
的成员函数:
// get读取一整行
char str4[20];
cin.get(str4, 20);
cout << "str4 = " << str4 << endl;
// get读取一个字符
cin.get(); // 先读取之前留下的回车符
cin.get(); // 再等待下一次输入
get函数同样需要传入两个参数:一个是保存信息的字符数组
,另一个是字符数组的长度
。(不常用)
这里还要注意跟getline的另一个区别:键盘输入总是以回车作为结束的;getline会把最后的回车符丢弃,而get会将回车符保留在输入队列中。
这样的效果是,下次再调用get试图读取一行数据时,会因为直接读到了回车符而返回空行。这就需要再次调用get函数,捕获下一个字符:
cin.get(); // 先读取之前留下的回车符
cin.get(); // 再等待下一次输入
这样就可以将之前的回车符捕获,从而为读取下一行做好准备。这也就解释了为什么要写两个cin.get():第一个用来处理之前保留在输入队列的回车符;第二个用来等待下一次输入,让窗口保持开启状态。