Честно говоря, я даже не понимаю ваш код. Например, что переменная count
делает в программе. Или почему вы используете дополнительный контейнер типа std::vector
, когда все может быть и должно быть сделано с объектом типа std::string
, потому что у него есть все ресурсы для выполнения задачи.
Контейнер std::vector
требуется только в том случае, если назначение состоит в том, чтобы разбить строку на слова и вернуть слова в объект типа std::vector<std::string>
. Но ваша задача совершенно иная.
Обратите внимание, что в общем случае между словами может быть несколько пробелов. Даже если это не так, в любом случае вы должны использовать общий подход и не полагаться на то, что между словами есть только один пробел.
Ваша функция не имеет смысла, например, когда исходная строка начинается с пробела персонаж. В этом случае count
будет равен 1
из-за этого, если оператор
if (currentChar == ' ')
{
count++;
continue;
}
, но размер вектора будет равен 0, так как words.size()
не равен count
тогда будет выполняться оператор else
else if((int)words.size() == count)
{
words.push_back(¤tChar);
}
else
{
words[count] += currentChar;
}
, что приводит к неопределенному поведению.
Я могу предложить следующее решение. В демонстрационной программе ниже я не использую стандартный алгоритм std :: reverse, потому что я думаю, что вы должны повернуть слово собственным кодом.
Вот, пожалуйста.
#include <iostream>
#include <string>
#include <utility>
std::string spinWords( const std::string &s, std::string::size_type length = 5 )
{
std::string t( s );
const char *delim = " \t";
for ( std::string::size_type i = 0; i != t.size(); )
{
auto pos = t.find_first_not_of( delim, i );
if ( pos != std::string::npos )
{
i = t.find_first_of( delim, pos );
if ( i == std::string::npos ) i = t.size();
if ( length < i - pos )
{
auto n = i - pos;
for ( std::string::size_type j = 0; j < n / 2; j++ )
{
std::swap( t[pos + j], t[i - j - 1] );
}
}
}
else
{
i = t.size();
}
}
return t;
}
int main()
{
std::string s( "1 12 123 1234 12345 123456 1234567 123456789 1234567890" );
std::cout << s << '\n';
std::cout << spinWords( s ) << '\n';
return 0;
}
Выход программы:
1 12 123 1234 12345 123456 1234567 123456789 1234567890
1 12 123 1234 12345 654321 7654321 987654321 0987654321