size_t i <_str.length создает бесконечный цикл в C++
У меня есть класс (массив), см. Ниже. Я хочу создать метод Array::read(_str), чтобы дать объекту Array массив, набранный в интерфейсе. (например строка _str = "1 2 3")
Чтобы определить количество двойников, в которое нужно преобразовать строку, я считаю количество пробелов. Пробелы найдены правильно, но цикл не заканчивается после последнего пробела. (см. текст на экране вывода).
Почему цикл не заканчивается после нахождения обоих пробелов??
ctor Array
Array::Array(int _size)
{
//ctor
length = _size ;
myArray = new double[length] ; // initialize array
//default initialization
for(size_t i = 0; i < length; i++)
{
myArray[i] = i ;
}
}
метод Array:: read (строка _str)
void Array::read(string _str)
{
// string_t find (<what to search>, <starting pos>) const ;
// determine length (number of numbers)
length = 0 ;
int steps = 0 ;
size_t i = 0 ;
cout<<"Value of _str.length() : "<<_str.length() <<endl ; // test
while( i < _str.length() && steps < 100)
{
// search for space starting it i
i = _str.find(" ",i ) ;
if(i!=string::npos) // npos is greatest possible size_t
cout<<"_ found at: 1 = "<< i <<endl ;
length ++ ; // new number present
i ++ ; // next time start after space
steps ++ ; // to prevent endless loop
}
cout<<endl<<steps ;
delete[] myArray ; // free old array
myArray = new double[length] ; // allocate space
// fill with doubles
}
вывод текста на экран
Value of _str.length() : 5
_ found at: i = 1
_ found at: i = 3
_found at: i = 1
_found at: i = 3
Это повторяется до 100
таким образом цикл завершается только условием шагов.
3 ответа
string::npos
определяется как максимально возможное значение size_t
,
const size_t npos = -1;
Когда вы не найдете символов, i
равно npos
, Затем вы добавляете один к нему, и он переполняется, становясь 0
,
В качестве решения попробуйте это:
if (i != string::npos) {
// ...
i++;
}
Вам нужно разорвать петлю, если string::find
возвращает string::npos
:
while( i < _str.length() && steps < 100)
{
// search for space starting it i
i = _str.find(" ",i ) ;
if( i==string::npos )
break;
else // npos is greatest possible size_t
cout<<"_ found at: 1 = "<< i <<endl ;
length ++ ; // new number present
i ++ ; // next time start after space
steps ++ ; // to prevent endless loop
}
Я только что узнал, что если я изменю цикл на:
while( i < _str.length() && steps < 100)
{
// search for space starting it i
i = _str.find(" ",i ) ;
if(i!=string::npos) // npos is greatest possible size_t
{
cout<<"_ found at: 1 = "<< i <<endl ;
length ++;
i ++ ; // next time start after space
}
steps ++ ; // to prevent endless loop
}
Функция действительно дает правильный результат. (3 шага, 2 пробела найдено) Спасибо за ответы на вопросы!