Проблема с сохранением 10 целых чисел в массив C

#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.