Когда я ввожу пользовательские данные «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.
Также начните использовать отладчик. Что такое отладчик и как он может помочь мне диагностировать проблемы
for(int i = 0; i< inputOne.length(); i++){ arrOne[i] . . .
будет переполнение буфера, когда i равно inputOne.length() - 1. (Предполагая, что вы используете нестандартное расширение компилятора, которое обрабатывает int arrOne[inputOne.length() - 1]). Та же проблема во втором цикле for. потенциально может вызывать симптомы, которые вы испытываете.
int array[5] содержит 5 элементов с допустимыми индексами 0, 1, 2, 3 и 4. Не 5.
Почему -1
в размерах ваших массивов? Возможно: вы исходите из образа мышления C, где вам придется учитывать нулевой терминатор (затем забыли об этом в своих циклах)?
Поскольку @user12002570 говорит, что вы не используете стандартный C++, при компиляции кода убедитесь, что вы включили ВСЕ предупреждения, как показано здесь. И вы получите вот такую ошибку warning: ISO C++ forbids variable length array 'arr'
не уверен, что это то, что вам нужно, проверьте это,
#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
Я инициализировал массивы на одно более короткое значение, чем должно было, отсюда и странное поведение. Оцените быстрый ответ.
Лучше сделать эти динамически выделяемые массивы векторами. Затем вы можете заполнить их std::transform
. Например. `std::transform(foo.begin(), foo.end(), std::back_inserter(vec), [](auto ch) { return ch - '0'; });
int arrOne[inputOne.length() - 1]
не является стандартным C++. Используйтеstd::vector
. Я бы также порекомендовал хорошую книгу по C++