#c #arrays
#c #массивы
Вопрос:
Хорошо, я очень смущен тем, почему это происходит. Все, что я пытаюсь сделать, это поместить 10 целых чисел из входных данных в массив. Почему это происходит.
#include <iostream>
using namespace std;
int getData(float intArray[10]);
void printData(float intArray[10]);
int main() {
float myArray[10];
getData(myArray);
printData(myArray);
cin.get();
cin.ignore();
}
int getData(float intArray[]) {
for (int i = 0; i < 10; i )
{
std::cout << "Enter a number:";
std::cin >> intArray[10];
}
return 1;
}
void printData(float intArray[10]){
cout << intArray;
}
Если бы вы могли, пожалуйста, сказать мне, где я ошибаюсь, это было бы очень ценно. Спасибо!
Комментарии:
1. Я забыл упомянуть, что на выходе получаются просто случайные целые числа и символы. ПРИМЕР: 00B3F724
2. Вы читаете не в массив, вы читаете в элемент
[10]
массива, который не существует и дает вам неопределенное поведение. Вывод содержимого элементов массива, которые не были установлены, также не подходит.3. Моя цель — просветить вас. Если это означает сказать вам, что вы сделали неправильно, это то, что я собираюсь сделать. Если это означает решение какого-то причудливого уголка вселенной программирования, это то, что я сделаю вместо этого. Все зависит от качества вопроса.
4.
std::cin >> intArray[10]
считываетint
и записывает его в единицу после последнего элементаintArray
. Это неопределенное поведение. Исправьте это, изменивintArray[10]
наintArray[i]
, чтобы цикл считывал значения последовательно. Инструкцияcout << intArray;
выводит в виде указателя адрес первого элемента этого массива. Указатели (отличные от указателей наchar
, которые обрабатываются по-разному) обычно выводятся в шестнадцатеричном формате. Исправьте это, создав цикл, который каждый раз в цикле выводит один элементintArray
. Голосование за закрытие, поскольку обе проблемы по сути являются опечатками.
Ответ №1:
Судя по тому, как написан ваш код, вы всего лишь добавляете пользовательский ввод к [10]
элементу intArray[]
в том for
цикле, который вы создали. Кроме того, любая информация, добавленная в массив в intArray[10]
или за его пределами, помещается за пределы.
Единственный способ, которым я могу действительно продемонстрировать, что я имею в виду, это…
for (int i = 0; i < 10; i )
{
std::cout<<"Enter a number:";
std::cin >> intArray[i];
}
Еще одна вещь, которую я заметил, это то, что вы создаете другой массив с тем же именем в вашем printData
методе. Вместо этого вам следует передать intArray
заполняемую вами информацию этому методу и использовать его для отображения вашей информации.
Ответ №2:
Проблема заключается в этом блоке кода-
for (int i = 0; i < 10; i )
{
std::cout << "Enter a number:";
std::cin >> intArray[10];
}
Как упоминалось в других ответах и комментариях, вы сохраняете все значения в 10-м слоте памяти массива.
Согласно вашему комментарию
Я забыл упомянуть, что на выходе получаются просто случайные целые числа и символы. ПРИМЕР: 00B3F724
00B3F724=> Это адрес памяти, выделенный массиву и в котором будут храниться элементы, которые будут вставлены.
Как на самом деле работает массив-
float myArray[10];
Приведенный выше фрагмент создает 10 единиц пространства памяти. Единицы измерения различаются в зависимости от типа, который будет храниться в массиве. В этом случае он содержит значения с плавающей запятой, поэтому каждое пространство памяти будет состоять из 4 байт. У всех этих пространств есть адрес для поиска и других операций. Все эти пробелы ожидают, что будет вставлено значение с плавающей точкой.
Поскольку вы используете цикл, вам нужно выполнить цикл по массиву (все ячейки памяти, выделенные для массива) и выделить элемент с плавающей запятой для каждого из них, а не только для последнего элемента (10-го). Фактически ваш цикл for станет
for (int i = 0; i < 10; i )
{
std::cout << "Enter a number:";
std::cin >> intArray[i];
}
Вместо intArray[10]
вставки значений, подобных этому intArray[i]
. Поскольку я буду проходить через все слоты на каждой итерации цикла, вставьте значения в слот.
Ваш код будет выглядеть следующим образом
#include <iostream>
using namespace std;
int getData(float intArray[10]);
void printData(float intArray[10]);
int main() {
float myArray[10];
getData(myArray);
printData(myArray);
cin.get();
cin.ignore();
}
int getData(float intArray[]) {
for (int i = 0; i < 10; i )
{
std::cout << "Enter a number:";
std::cin >> intArray[i];
}
return 1;
}
void printData(float intArray[10]){
cout << intArray;
}
Ответ №3:
Как вы знаете, если массив объявлен как myArray[10], его индекс находится в диапазоне от 0 до 9. Ввод значения в myArray[10] выйдет за пределы привязки и приведет к созданию мусорного значения.
В getData(float intArray[]) вы всегда перезаписываете содержимое intArray[10], когда оно находится вне пределов, поэтому оно не сохраняется в реальном массиве. Вы должны записать свои getData (float intArray[]) следующим образом :
int getData(float intArray[]) {
for (int i = 0; i < 10; i )
{
std::cin >> intArray[i];
}
return 1;
}
Также в PrintData(float intArray[10]) вы печатаете только базовый адрес массива (т. е. имя массива дает адрес 0-го индекса).Таким образом, правильный код был бы:
void printData(float intArray[])
{
for(int i=0;i<10;i )
{
cout << intArray[i]<<" ";
}
}
Ответ №4:
Просто измените,
std::cin >> intArray[10];
Для,
std::cin >> intArray[i];
Что вы делаете неправильно:
вы сохраняете значение на 10-й позиции (на самом деле это 11-я позиция) снова и снова, и значение на 10-й позиции снова заменяется новым значением, а также 10-я позиция не существует в массиве, потому что индекс массива начинается с 0, поэтому ваш массив имеет значения индекса от 0 до 9.