主要参考getline和cin.getline的区别_与getline相似的函数-CSDN博客
用户从键盘输入字符串,通过换行符将输入的字符串写入到输入缓冲区中,且会将末尾的换行符一起写入输入缓冲区
1.cin
如cin>>a,从输入缓冲区中读取数据,遇到space(enter、tab)时读取结束,并将space(enter、tab)之前的数据写入a中,但是会将space(enter、tab)遗留在输入缓冲区中
ps:如果输入缓冲区中的数据以space(enter、tab)开头,那么cin>>会抛弃掉这些,直到遇到非space(enter、tab)的数据才进行读取,此时前面被抛弃掉的space(enter、tab)也不在输入缓冲区中了
2.getline
2.1 第一个版本
一个istream对象的引用,和一个string对象的引用
string str,s;
cin >> str;
getline(cin, s);
space和tab键会像普通字符一样赋值给s,遇到换行符结束,并且会丢弃换行符
ps:getline()是不会忽略换行符的 ,如果之前的缓冲区有换行,要用getchar()把换行符吃掉,再使用getline()一行一行的读取。
2.2 第二个版本
新增加了一个参数,是字符类型的,表示终止符,遇到该终止符结束输入,并且不会丢弃换行符
🟥:第一个版本的getline把换行符丢了,而第二个版本的又不会丢弃换行符,所以会有一个换行打出来!
🔴:第二个版本的getline不会丢弃换行符!
3.cin.getline
cin.getline和对应版本的getline很相似,区别是一个接受字符数组首地址和个数,另一个是istream类型string类型;规则也对应吧
4. 2015.2单词反转
#include <iostream>
#include <string>
using namespace std;
string reverseWords(string &s) { //传引用
int length = s.length(); //s.length()可以用
int i = 0;
while (i < length) {
int start = i;
while (i < length && s[i] != ' ') { //s[i]可以用
i++;
}
int left = start, right = i - 1;
while (left < right) {
swap(s[left], s[right]); //可以直接用
left++;
right--;
}
while (i < length && s[i] == ' ') {
i++;
}
}
return s;
}
int main() {
int t;
cin >> t;
getchar(); //把缓冲区里的换行符吃掉,不然会影响getline
while (t) {
string s;
getline(cin, s); //字符串里有空格,必不能用cin
reverseWords(s); //直接s就行,它本身是类对象好像
cout << s << endl;
t--;
}
}