常用有三:
1. cin >> x
- 读到
tab/space/enter
处停止,不会吃掉符号 - 从缓冲区读数据到变量x,而不是从键盘输入读取。(读数据前清空缓冲区: cin.sync();)
用法解析
- 输入一个数字或字符或字符串
- 接收一个字符串(到char数组或string),遇 tab/space/enter 结束,但是并不会吃掉 遇到的 空格/换行符,该空格/换行符还会参与下一次的读取。
2. cin.get()
和 getchar()
- 用法同
cin >> x
, 但是区别在于会吃掉tab/space
用法解析
- 在
cin>>
读入数据完成之后,如果接下来的字符是换行符,那么在使用getline()
之前需要用getchar()
把换行符吞掉,然后再使用getline()
读入下一行数据。
3. getline(istream is, string str, 结束符)
- 常用于读取以
,
分割开的字符串 - 可以读入
SPACE/TAB
,遇到ENTER
停止读取;且读取完成后会丢弃末尾的换行符。 - 结束符默认是换行符
‘\n’
/* 例题: 输入 --> 输出
a,c,bb a,bb,c
f,dddd dddd,f
nowcoder nowcoder
*/
#include<iostream>
#include<string>
#include<sstream>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
vector<string> res;
string str;
while(cin >> str){
stringstream ss(str);
string temp;
// 分隔字符串
while(getline(ss, temp, ',')){
res.push_back(temp);
}
sort(res.begin(), res.end());
for(int i = 0; i < res.size() - 1; i++){
cout << res[i] << ",";
}
cout << res.back() << endl;
res.clear();
}
return 0;
}
总结:
-
cin >> x
可以用来读字符串或数字, 但是局限在于无法区分空格、换行,回车
,遇到了就要停下来cin>>x
遇到换行符之后停止读取,但是不会读入这个换行符,在接下来的读取中还要考虑到这个换行符的存在;
因此,如果接下来还是用cin读取,cin会跳过开头换行符继续下一行数据的读取,不会受影响。 -
getchar()
基本同cin
, 但是会吃掉空格、回车
,常用于判断字符串是否结束当同时使用
cin>>
,getline()
时,需要注意的是,在cin>>
读入数据完成之后,如果接下来的字符是\n
,那么在使用getline()
之前需要用getchar()
把换行符吞掉,然后再使用getline()
读入下一行数据。
否则,getline()
会首先读入换行符,然后停止读取。由于getline()
函数会丢弃数据末尾的换行符,因此最终读入的数据为空。
示例:if(getchar() == '\n'){ ... }
-
getline()
常用于读取用特殊符号分隔的字符串getline()
函数遇到换行符后停止,不但读入这个换行符,而且在读取的数据中丢弃它,这样后续的getline()
读取就不用考虑这个换行符的存在了。