Два последовательных цикла for в C ++, второй цикл не работает

Задача: у меня есть два массива. Первый массив: evenList, а второй - oddList. Я хочу напечатать четные и нечетные числа между заданными диапазонами в этом формате.

Снимок экрана; Печать четных и нечетных чисел

Это мой код,

cout << "\nEven numbers between " << lowerLimit << " to " << upperLimit << ": ";

for(int i; i < evenList.size(); i++){
    cout << evenList[i] << "  ";
}

cout << "\n\nOdd numbers between " << lowerLimit << " to " << upperLimit << ": ";

for(int j; j < oddList.size(); j++){
    cout << oddList[j] << "  ";
}

первый цикл for печатает желаемый результат, но второй цикл не показывает нечетные числа. Вот результат:

Снимок экрана; нежелательный вывод

Я уже читал кое-что о циклах for, но просто не могу получить ответ. Если кто-то столкнулся с тем же вопросом или проблемой и получил ответ, поделитесь. Я буду очень признателен.


person Charls Catipay    schedule 11.10.2019    source источник
comment
Пожалуйста, инициализируйте итераторы до 0 в цикле. Примерно так для (int i = 0; i ‹evenList.size (); i ++)   -  person Bhawan    schedule 11.10.2019
comment
Не показывать изображения текста, скопируйте и вставьте текст как текст в вопрос. Также найдите время, чтобы прочитать о том, как задавать хорошие вопросы, а также о этот контрольный список вопросов. И всегда старайтесь создать правильный минимальный воспроизводимый пример, чтобы показать нам.   -  person Some programmer dude    schedule 11.10.2019
comment
Примечание. Для переносимости (и, на мой взгляд, более приятного кода) используйте std::endl вместо \n для новых строк.   -  person fredrik    schedule 11.10.2019
comment
Включите предупреждения компилятора и затем исправьте их. Попробуйте -Wall -Wextra параметры для gcc (которые, я полагаю, использует Dev-C ++), найдите, где вы можете установить параметры компилятора в своей среде IDE. В этом случае компилятор, например, прямо сказал бы вам, в чем проблема.   -  person hyde    schedule 11.10.2019
comment
@fredrik Хотя я в целом согласен, \n в текстовом потоке всегда должен поступать правильно. Или, по крайней мере, я не знаю платформы, где бы этого не было.   -  person hyde    schedule 11.10.2019
comment
@fredrik Использование std::endl аналогично использованию "\n" << std::flush. Использование простого '\n' для новой строки почти всегда достаточно.   -  person Some programmer dude    schedule 11.10.2019
comment
@hyde А как насчет Windows?   -  person fredrik    schedule 11.10.2019
comment
@fredrik Вот почему у вас есть файлы и потоки в двоичном режиме и текстовом режиме. Поток в текстовом режиме автоматически преобразует простой '\n' в правильную последовательность конца строки для платформы. И сделайте обратный перевод при чтении (например, \r\n в \n).   -  person Some programmer dude    schedule 11.10.2019


Ответы (4)


Вы не инициализируете свои итераторы. int i; должно быть int i = 0;, и то же самое для int j. На данный момент это неопределенное поведение. Это просто шанс, что это сработало в первый раз, а не во второй, с тем же успехом оно могло сработать оба раза, не сработать совсем, сразу же вылететь или сделать что-то совершенно другое.


Ваш компилятор выдает предупреждение для этого кода? В идеале это должно быть что-то вроде «использована неинициализированная локальная переменная 'i'». Всегда прислушивайтесь к предупреждениям компилятора, они могут помочь указать на некоторые распространенные ошибки. Если ваш компилятор не выдает здесь предупреждений, попробуйте настроить его более строгим с предупреждениями.

person Blaze    schedule 11.10.2019
comment
Когда я инициализирую свои i и j, я получил желаемый результат. Спасибо @Blaze. Во-первых, у меня два вопроса: следует ли инициализировать все int равными 0? Во-вторых: компилятор не показывает никаких ошибок, таких как неинициализированная локальная переменная. Для этого есть настройки? - person Charls Catipay; 11.10.2019
comment
Вам не нужно специально инициализировать их значением 0, но обычно вы должны инициализировать или установить переменные в значение перед их чтением (это включает ++, который должен прочитать значение, чтобы впоследствии увеличить его). Что касается предупреждения компилятора, это зависит от того, какой компилятор вы используете - для GCC это -Wuninitialized (но лучше просто установить -Wall, чтобы включить предупреждения и для многих других проблем). - person Blaze; 11.10.2019

У меня есть два момента, которые приводят вас к нежелательному результату.

  1. Всегда полезно инициализировать переменную. В большинстве случаев это может привести к ошибке сегментации. В приведенном выше коде вы не инициализировали переменные в цикле for.
  2. Я не использовал C ++, но полагаю, что вы используете массивы, evenList и oddList. И вы используете условие j<oddList.size(). Единственный способ, при котором это условие может пойти не так, - это если в массиве oddList нет ни одного элемента. Проверьте, есть ли у вас какие-либо элементы в этом массиве.
person Jaiveer    schedule 11.10.2019

Попробуйте использовать FOR EACH LOOP, чтобы избежать путаницы при инициализации переменной.

for(string s : eventList){ cout << s << endl; }

и то же самое для второй петли. Надеюсь, на этот раз это сработает

person Humxa Moghal    schedule 11.10.2019

Вы также можете использовать цикл for на основе диапазона

cout<<"\nEven numbers between " << lowerLimit << " to " << upperLimit << ": ";
for (const auto &e: evenList)
{
    cout << e << "  ";
}

cout << "\n\nOdd numbers between " << lowerLimit << " to " << upperLimit << ": ";

for (const auto &o: oddList)
{
    cout << o << "  ";
}
person Coolgun    schedule 11.10.2019