Для начала не используйте магические числа, такие как 32.
Во-вторых, символ табуляции также может рассматриваться как пустой разделитель.Первый параметр должен быть константной ссылкой на строку.
Нет необходимости создавать копию параметра внутри функции.
Этот цикл
for (int i = 0; i < temp.length() - 1; ++i) {
if ((int) cut == (int) temp[i]) {
v.push_back(temp.substr(begin, i));
begin = i + 1;
}
}
не имеет смысла.Например, строка может содержать два последовательных пробела.Во-вторых, второй аргумент вызова substr temp.substr(begin, i)
неверен.В нем должна быть указана длина подстроки,
Вместо цикла используйте стандартные функции-члены поиска класса std::string
.
Вот демонстрационная программа, которая показывает, как эта функция может быть реализована..
#include <iostream>
#include <string>
#include <vector>
std::vector<std::string> splitStr( const std::string &s,
const std::string &delim = " \t" )
{
std::vector<std::string> v;
for ( std::string::size_type pos = 0, n = 0;
( pos = s.find_first_not_of( delim, pos ) ) != std::string::npos;
pos += n )
{
n = s.find_first_of( delim, pos );
n = ( n == std::string::npos ? s.size() : n ) - pos;
v.push_back( s.substr( pos, n ) );
}
return v;
}
int main()
{
for ( const auto &s : splitStr( "Hello this is a test!" ) )
{
std::cout << s << std::endl;
}
return 0;
}
Его вывод
Hello
this
is
a
test!