Цикл входит в бесконечный цикл, если отсутствует cout

Я столкнулся с чем-то очень странным. Код, с которым у меня возникли проблемы:

int stringPos;
int found1;
while (stringPos < 1);
{
//start searching inString for framen starting at foundn and record
found1 = inString.find(frame1, found1);
cout << found1 << endl;//if return is a number, push back foundn to a vector
if (found1 != -1)
{
foundPositions.push_back(found1);
}
//if return is npos, then break the loop
else
{
stringPos=1;
}

//add 1 to foundn so that the search would continue from where the
//search ended last
found1+=1;
}

Странно то, что когда я ставлю cout << found1 << endl; ниже линии found1 = inString.find(frame1, found1); цикл выполняется правильно. Однако, если у меня нет cout << found1 << endl; он входит в бесконечный цикл …

Какие-либо предложения? СПАСИБО!

0

Решение

Это ошибка (и использует унифицированную переменную):

while (stringPos < 1);

как это эквивалентно:

while (stringPos < 1) {}

Если это не входит в бесконечный цикл, код, следующий за ним, будет выполнен только один раз. Исправлять:

  • Инициализируйте переменные stringPos а также found1,
  • Используйте тип size_t за stringPos а также found как std::string::find() не возвращает int, но возвращает size_type (обычно size_t).
  • использование std::string::npos вместо -1 проверить на не найдено.
  • Удалите конечную точку с запятой.
6

Другие решения

Ваша программа имеет неопределенное поведение, потому что вы пытаетесь использовать значение неинициализированной переменной здесь:

while (stringPos < 1)
//     ^^^^^^^^^
//     This is uninitialized

И здесь:

found1 = inString.find(frame1, found1);
//                             ^^^^^^
//                             This is uninitialized

Кроме того, даже если предположить, что ваши переменные были инициализированы, у вас есть точка с запятой, которая делает ваш while цикл либо неоперативный или бесконечный цикл (как правильно указал hmjd в своем ответе).

2

Я бы начал с инициализации переменных stringPos и ​​found1.

0
По вопросам рекламы [email protected]