Почему мой первый массив (arrOne) изменяется, когда я изменяю второй массив (arrTwo)?

Когда я ввожу пользовательские данные «12345» и «0», я вижу, что в первом цикле arrOne заполняется так, как я ожидаю, 1, 2, 3, 4, 5. Однако после 2-го цикла (который заполняет arrTwo ), когда я распечатываю значения arrOne (используя третий цикл), я вижу, что значения теперь равны 0, 2, 3, 4, 5.

Я ломаю голову над тем, как было изменено начальное значение arrOne после начального цикла. Цените любое руководство!

#include <iostream>
#include <string>
#include <iomanip>

using namespace std;

int main()
{
    // Write your main here
    string inputOne = "";
    string inputTwo = "";


    cout << "Please enter two positive integers up to 20 digits long" << endl;
    cin >> inputOne;
    cin >> inputTwo;

    int arrOne[inputOne.length() - 1];
    int arrTwo[inputTwo.length() - 1];

    for(int i = 0; i< inputOne.length(); i++){
        arrOne[i] = inputOne[i] - '0';
        cout<< "arrOne[i] = " << arrOne[i] << endl;
    }

    for(int i = 0; i< inputTwo.length(); i++){
        arrTwo[i] = inputTwo[i] - '0';
        cout<< "arrTwo[i] = " << arrTwo[i] << endl;
    }

    for(int i = 0; i< inputOne.length(); i++){
        cout<< "arrOne[i] = " << arrOne[i] << endl;
    }

    return 0;
}

Я ожидаю, что после заполнения массива arrTwo массив arrOne продолжит хранить 1, 2, 3, 4, 5.

int arrOne[inputOne.length() - 1] не является стандартным C++. Используйте std::vector. Я бы также порекомендовал хорошую книгу по C++
user12002570 06.05.2024 05:57

Также начните использовать отладчик. Что такое отладчик и как он может помочь мне диагностировать проблемы

user12002570 06.05.2024 05:59
for(int i = 0; i< inputOne.length(); i++){ arrOne[i] . . . будет переполнение буфера, когда i равно inputOne.length() - 1. (Предполагая, что вы используете нестандартное расширение компилятора, которое обрабатывает int arrOne[inputOne.length() - 1]). Та же проблема во втором цикле for. потенциально может вызывать симптомы, которые вы испытываете.
Avi Berger 06.05.2024 06:04

int array[5] содержит 5 элементов с допустимыми индексами 0, 1, 2, 3 и 4. Не 5.

Avi Berger 06.05.2024 06:12

Почему -1 в размерах ваших массивов? Возможно: вы исходите из образа мышления C, где вам придется учитывать нулевой терминатор (затем забыли об этом в своих циклах)?

JaMiT 06.05.2024 06:28

Поскольку @user12002570 говорит, что вы не используете стандартный C++, при компиляции кода убедитесь, что вы включили ВСЕ предупреждения, как показано здесь. И вы получите вот такую ​​ошибку warning: ISO C++ forbids variable length array 'arr'

Pepijn Kramer 06.05.2024 07:29
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

не уверен, что это то, что вам нужно, проверьте это,

#include <iostream>
#include <string>
#include <iomanip>

using namespace std;

int main()
{
    // Write your main here
    string inputOne = "";
    string inputTwo = "";

    cout << "Please enter two positive integers up to 20 digits long" << endl;
    cin >> inputOne;
    cin >> inputTwo;

    int* arrOne = new int[inputOne.length()];
    int* arrTwo = new int[inputTwo.length()];

    for(int i = 0; i< inputOne.length(); i++){
        arrOne[i] = inputOne[i] - '0';
        cout<< "arrOne[i] = " << arrOne[i] << endl;
    }

    for(int i = 0; i< inputTwo.length(); i++){
        arrTwo[i] = inputTwo[i] - '0';
        cout<< "arrTwo[i] = " << arrTwo[i] << endl;
    }

    for(int i = 0; i< inputOne.length(); i++){
        cout<< "arrOne[i] = " << arrOne[i] << endl;
    }

    delete[] arrOne;
    delete[] arrTwo;

    return 0;
   }

результат, который я получу от g++, будет:

Please enter two positive integers up to 20 digits long
12345
0
arrOne[i] = 1
arrOne[i] = 2
arrOne[i] = 3
arrOne[i] = 4
arrOne[i] = 5
arrTwo[i] = 0
arrOne[i] = 1
arrOne[i] = 2
arrOne[i] = 3
arrOne[i] = 4
arrOne[i] = 5

вывод вашего кода был;

Please enter two positive integers up to 20 digits long
12345
0
arrOne[i] = 1
arrOne[i] = 2
arrOne[i] = 3
arrOne[i] = 4
arrOne[i] = 5
arrTwo[i] = 0
arrOne[i] = 0
arrOne[i] = 2
arrOne[i] = 3
arrOne[i] = 4
arrOne[i] = 5

Я инициализировал массивы на одно более короткое значение, чем должно было, отсюда и странное поведение. Оцените быстрый ответ.

Austin Wolff 06.05.2024 06:10

Лучше сделать эти динамически выделяемые массивы векторами. Затем вы можете заполнить их std::transform. Например. `std::transform(foo.begin(), foo.end(), std::back_inserter(vec), [](auto ch) { return ch - '0'; });

Chris 06.05.2024 06:24

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