c++之面试题(2)实现字符串的分割函数SplitStr
题目描述
3.实现一个将字符串按指定字符分隔的函数,形式已经确定如下,请完成标有“//请补充”的内容。
说明:返回值为是否找到分割符(true找到,false未找到),当未找到分割符时返回原字符串。
举例:SplitStr("abc|bc|c", '|', vect) 返回true, vect结果:abc, bc, c
SplitStr("abc|bc|c", 's', vect) 返回false, vect结果:abc|bc|c
SplitStr("|bc|c", '|', vect) 返回true, vect结果:空字符串, bc, c
bool SplitStr(const char* pStr, char chSplit, vector<string>& vectRet)
{
//请补充
const char* p = pStr;
const char* pStart = pStr;
int32 nLen = 0;
char ch = 0;
while (1)
{
ch = *p;
//请补充
p++;
}
return ((int32)vectRet.size() > 1);
}
代码
自己实现的代码被//----------------------------------------------------------------------------------------
夹在中间
bool SplitStr(const char* pStr, char chSplit, std::vector<std::string>& vectRet)
{
//请补充
//----------------------------------------------------------------------------------------
if (nullptr == pStr || NULL == pStr)
return false;
//----------------------------------------------------------------------------------------
const char* p = pStr;
const char* pStart = pStr;
int nLen = 0;
char ch = 0;
while (1)
{
ch = *p;
//----------------------------------------------------------------------------------------
// 已经到字符串结尾,跳出循环
if ('\0' == ch)
{
if (nLen == 0)
{
;
}
else
{
// 将剩下的字符串拷贝到vector中。
std::string str(pStart, nLen);
vectRet.push_back(str);
}
break;
}
// 还没有到字符串的结尾
else
{
// 与分隔符不一致,长度+1,继续找
if (ch != chSplit)
{
nLen++;
}
else
{
// 处理"|"开头的情况
if (p == pStr)
{
pStart += 1;
}
else
{
//
std::string str(pStart, nLen);
vectRet.push_back(str);
// 这里+ 1是为了跳过下一个 分隔符
pStart += nLen + 1;
nLen = 0;
}
}
}
//----------------------------------------------------------------------------------------
p++;
}
return ((int)vectRet.size() > 1);
}
测试
- 1.代码
std::vector<std::string> vec;
bool ret = SplitStr("abc|bc|c", 's', vec);
std::cout << ret << "\n";
std::for_each(std::begin(vec), std::end(vec), [](const std::string& str)
{
std::cout << "str=";
if (0 == str.length())
std::cout << " ";
else
std::cout << str.c_str() << " ";
});
"abc|bc|c" 输出结果:
- 2.代码
std::vector<std::string> vec;
bool ret = SplitStr("abc|bc|c", '|', vec);
std::cout << ret << "\n";
std::for_each(std::begin(vec), std::end(vec), [](const std::string& str)
{
std::cout << "str=";
if (0 == str.length())
std::cout << " ";
else
std::cout << str.c_str() << " ";
});
输出结果:
- 3.代码
std::vector<std::string> vec;
bool ret = SplitStr("|bc|c", '|', vec);
std::cout << ret << "\n";
std::for_each(std::begin(vec), std::end(vec), [](const std::string& str)
{
std::cout << "str=";
if (0 == str.length())
std::cout << " ";
else
std::cout << str.c_str() << " ";
});
输出结果