getline()和自定义Split()函数(以及stringstream流)
本文主要介绍了C++的getline()以及基于getline()定义下的Split()函数,及其使用说明。
getline()
首先,getline()函数的原型如下:
头文件:
#include<string>
istream& getline(istream &is , string &str,char delim);
其中,
&is表示一个输入流,比如说cin。
(较常见的 getline(cin,str) )
&str表示把从输入流中读入的字符串存放在str这个字符串中。
delim表示遇到这个字符停止读入。(默认为’\n’,即遇到回车停止读入)
Example1:
getline(cin, line, '#');
此时输入“Hello#World”时,输入流只读入了“Hello”,后面的并没有存放到line字符串中。
Example2:
while(getline(cin, line))
此时默认’\n’停止读入。
在这个语句中,首先getline从标准输入设备上读入字符,然后返回给输入流cin,所以while判断语句的真实判断对象是cin,也就是判断当前是否存在有效的输入流。(并不是line是否为空,所以无法通过输入一个空的line达到跳出循环的目的)。
所以,以下写法永远不能退出while()循环:
while(getline(cin, line))
cout << line << endl;
Split()
在做LeetCode 824题山羊拉丁文时,需要使用类似Java库函数中的split()函数。
如果仅仅以空格分割字符串,可直接使用stringstream即可,因为stringstream默认就是用空格分割字符串的。
自定义Split()函数实现:
vector<string> Split(string s) {
vector<string> result;
stringstream ss(s);
string str;
while (ss >> str)
result.emplace_back(str);
return result;
}
如果要用其他特殊字符分割字符串,需要用getline()。
自定义Split()函数实现:
vector<string> Split(string s, char c) {
vector<string> result;
stringstream ss(s);
string str;
while(getline(ss, str, c)) {
result.push_back(str);
}
return result;
}
在主函数中调用Split()函数,将分割后的字符串存储在字符串数组中。
vector<string> strs = Split(sentence, ' ');
stringstream参考博文:
http://t.csdn.cn/FG3qS、http://t.csdn.cn/ZfFue