Во-первых, используйте оператор!=() на итераторах, а не оператор‹():
while (it != sentence.end())
Во-вторых, это наоборот: while (*it != ' ' && it != sentence.end())
Вы что-то делаете с итератором, чем проверяете, действителен ли итератор. Скорее, вы должны сначала проверить, действительно ли это:
while (it != sentence.end() && *it != ' ')
В-третьих, вы должны использовать ++iterator вместо iterator++, хотя это не связано с вашим сбоем.
В-четвертых, главная проблема здесь:
*it = '\n';
Из-за предшествующей проверки while (it != sentence.end()
можно достичь разыменования этого итератора, находясь в конце. Исправление будет заключаться в следующем:
if (it != sentence.end() && nextWordLength > distanceFromWidth)
Так что теперь, если вы дошли до конца, вы останавливаетесь.
После исправления предыдущей проблемы теперь единственная проблема заключается в следующем:
//skip the space
++it;
Это предполагает, что символ, который вы пропускаете, на самом деле является пробелом. Но как насчет конца строки? Запустите эту функцию с этой строкой:
"a test string " // <- space at end
И это удастся; он пропускает пробел, помещая итератор в end()
, цикл завершается и завершается успехом.
Однако без пробела он вылетит, потому что вы дошли до конца и пропускаете мимо конца. Чтобы исправить, добавьте проверку:
//skip the space
if (it != sentence.end())
{
++it;
}
В результате получается этот окончательный код:
std::string wordWrap(std::string sentence, int width)
{
std::string::iterator it = sentence.begin();
//remember how long next word is
int nextWordLength = 0;
int distanceFromWidth = width;
while (it != sentence.end())
{
while (it != sentence.end() && *it != ' ')
{
nextWordLength++;
distanceFromWidth--;
++it;
}
if (it != sentence.end() && nextWordLength > distanceFromWidth)
{
*it = '\n';
distanceFromWidth = width;
nextWordLength = 0;
}
//skip the space
if (it != sentence.end())
{
++it;
}
}
return sentence;
}
Вы можете заметить, что это выглядит так, как будто в нем много избыточных проверок. Это можно исправить:
std::string wordWrap(std::string sentence, int width)
{
std::string::iterator it = sentence.begin();
//remember how long next word is
int nextWordLength = 0;
int distanceFromWidth = width;
while (it != sentence.end())
{
while (*it != ' ')
{
nextWordLength++;
distanceFromWidth--;
++it;
// check if done
if (it == sentence.end())
{
return sentence;
}
}
if (nextWordLength > distanceFromWidth)
{
*it = '\n';
distanceFromWidth = width;
nextWordLength = 0;
}
//skip the space
++it;
}
return sentence;
}
Надеюсь, это поможет!
person
GManNickG
schedule
30.06.2009