因为这个软件的功能涉及到字符串的切割并重组,不过因为string中没有split函数,因此就想自己写一个字符串分割函数。
在网上查阅了相关的资料之后,发现istringstream流可以实现这个功能。
istringstream流可以绑定任意的string字符串,并且可以像fstring似的把被操作的对象当成一个“流”进行处理,并且istringstream有一个getLine函数的重载函数,可以实现对于指定分隔符的分割操作。
注意,在使用istringstream之前,需要包含他的头文件sstream,代码如下:
#include <iostream>
#include <string>
#include <sstream>
#include <list>
using namespace std;
list<string> split(const string&str, char splitFlag)
{
if (!str.empty())
{
istringstream iss(str);
list<string> resultSplit;
char buffer[1024] { 0 };
while (iss.getline(buffer, 1024, splitFlag))
{
resultSplit.push_back(buffer);
}
//也可以写成下述方式
//string strTemp;
//while (getline(iss, strTemp, splitFlag))
//{
//resultSplit.push_back(strTemp);
//}
return resultSplit;
}
else
{
return list<string>();
}
}
int main()
{
string str("192.168.3.4");
auto result = split(str, '.');
for (const auto& str : result)
{
cout << str << " ";
}
cout << endl;
return 0;
}
运行结果如下:
getLine的源码如下:
_Myt& __CLR_OR_THIS_CALL getline(_Elem *_Str, streamsize _Count)
{ // get up to _Count characters into NTCS, discard newline
return (getline(_Str, _Count, _Myios::widen('\n')));
}
_Myt& __CLR_OR_THIS_CALL getline(_Elem *_Str,
streamsize _Count, _Elem _Delim)
{ // get up to _Count characters into NTCS, discard _Delim
ios_base::iostate _State = ios_base::goodbit;
_Chcount = 0;
const sentry _Ok(*this, true);
if (_Ok && 0 < _Count)
{ // state okay, use facet to extract
int_type _Metadelim = _Traits::to_int_type(_Delim);
_TRY_IO_BEGIN
int_type _Meta = _Myios::rdbuf()->sgetc();
for (; ; _Meta = _Myios::rdbuf()->snextc())
if (_Traits::eq_int_type(_Traits::eof(), _Meta))
{ // end of file, quit
_State |= ios_base::eofbit;
break;
}
else if (_Meta == _Metadelim)
{ // got a delimiter, discard it and quit
++_Chcount;
_Myios::rdbuf()->sbumpc();
break;
}
else if (--_Count <= 0)
{ // buffer full, quit
_State |= ios_base::failbit;
break;
}
else
{ // got a character, add it to string
_DEBUG_POINTER(_Str);
*_Str++ = _Traits::to_char_type(_Meta);
++_Chcount;
}
_CATCH_IO_END
}
*_Str = _Elem(); // add terminating null character
_Myios::setstate(_Chcount == 0 ? _State | ios_base::failbit : _State);
return (*this);
}
通过追踪其源码,可以发现其分隔符只能是一个char类型的字符,并且缺省条件下为’\n’另外,后面return(*this)表明这个字符串在getLine的条件下,是相当于不断被吃掉的,这就是“流”的特点,直到最后没有东西吃的时候,就返回一个nullptr。