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 пробела найдено) Спасибо за ответы на вопросы!

Другие вопросы по тегам