У меня возникают проблемы в C ++, когда пользователь получает входные данные в функции, добавляет в массив и печатает этот массив - PullRequest
0 голосов
/ 06 февраля 2019

Я изучаю c ++ и пытаюсь попросить пользователя ввести 4 числа в функции, а затем просто напечатать массив.

int getFourNums();
int main(int argc, char** argv){

    int getNums;

    getNums = getFourNums();

    cout << "The array is: " getNums << endl;
}

int getFourNums(){

    int i;

    int myArray[4];
    cout << "Enter 4 nums: ";
    for(i = 0; i < 4; i++){
        cin >> myArray[i];
    }
    return myArray[i];

На данный момент он позволяет мне получитьчетыре числа, но результат печати: «Массив: 0.»Я не совсем уверен, почему массив, по-видимому, не заполняется.

Ответы [ 4 ]

0 голосов
/ 06 февраля 2019

Я вижу, что вы хотите вернуть весь массив, но просто посмотрите на ваш тип возвращаемого значения:

int getFourNums()

Вы возвращаете целое число, верно?В этой ситуации возвращаемое целое число всегда равно myArray[4].Имейте в виду, что это целочисленное значение, вы возвращаете что-то, что вам на самом деле не принадлежит!

Так что же делать?Я предлагаю вам передать свой массив для работы следующим образом:

 void getFourNums(int myArray[]){
    int i;
    cout << "Enter 4 nums: ";
    for(i = 0; i < SIZE; i++){
        cin >> myArray[i];
    }
}

Теперь вы заполнили свой массив.Как распечатать ваш массив тогда?Мы не можем просто дать имя нашего массива и сказать cout распечатать его, как вы (на самом деле вы не могли!).Здесь нет ничего волшебного.Мы собираемся напечатать элемент вашего массива один за другим:

void printFourNumbers(int array[])
{
    for(int i = 0 ; i < SIZE ; ++i)
    {
        cout << array[i] << endl;
    }
}

Наконец весь код выглядит так:

#include <iostream>
using namespace std;
const int SIZE = 4;

void getFourNums(int myArray[]);
void printFourNumbers(int array[]);

int main(int argc, char** argv){
    int myArray[SIZE];
    getFourNums(myArray);
    printFourNumbers(myArray);

}

void getFourNums(int myArray[]){
    int i;
    cout << "Enter 4 nums: ";
    for(i = 0; i < SIZE; i++){
        cin >> myArray[i];
    }
}

void printFourNumbers(int array[])
{
    for(int i = 0 ; i < SIZE ; ++i)
    {
        cout << array[i] << endl;
    }
}
0 голосов
/ 06 февраля 2019

Ваша основная проблема в том, что int getFourNums() может возвращать только одно целое число, а не их массив.Следующая проблема заключается в том, что функции не могут возвращать необработанные массивы по историческим причинам.Вы можете выбрать std::array, struct, содержащий массив, передать массив по ссылке в функцию или вернуть std::vector.Я предпочитаю это приложение std::vector - оно гибкое, и, хотя оно не столь эффективно, как std::array, вам, вероятно, следует установить значение по умолчанию std::vector, если только у вас нет веских причин.Ваш код getNums будет выглядеть следующим образом:

std::vector<int> getFourNums() {
    std::vector<int> result;
    cout << "Enter 4 nums: ";
    for(int i = 0; i < 4; i++){
        int v;
        cin >> v;
        result.push_back(v);
    }
    return result;
}

Чтобы напечатать вектор, см. этот вопрос .Мое личное предпочтение было бы основано на диапазоне для цикла над вектором;Ваши вкусы могут отличаться.

0 голосов
/ 06 февраля 2019

int getFourNums() позволит вам вернуть только один int, а не весь массив, и return myArray[i]; выходит за пределы, начиная с i == 4.Вы можете использовать только диапазон [0,3] в качестве индексов для вашего массива.Вот переработанная версия с комментариями в коде.

#include <iostream>
#include <vector>

// don't do "using namespace std;" since it includes
// a lot of stuff you don't need.

// Here's a function that will return a vector of int's
// It'll behave much like a C style array
// but can have variable length and you can use
// a lot of standard functions on it.

std::vector<int> getNums(size_t count) {

    // The "array" we'll return with "count" number of
    // default constructed int:s (they will all be 0):

    std::vector<int> myArray(count);

    std::cout << "Enter " << count << " nums: ";

    // A range based for loop that will go through
    // all int:s in "myArray". "num" will be
    // a reference to each int in the vector which
    // means that if you change the value of "num",
    // you'll actually change the value in the vector.

    for(int& num : myArray) {
        // read values into the int currently
        // referenced by num

        std::cin >> num;
    }

    // return the vector by value
    return myArray;
}

// Put main() last so you don't have to forward declare the functions
// it uses

int main() {

    // call getNums with the value 4 to read 4 int:s
    std::vector<int> Nums = getNums(4);

    std::cout << "The array is:";

    // print each int in the vector. There's no need to use
    // a reference to the int:s here since we won't be changing
    // the value in the vector and copying an int is cheap.

    for(int num : Nums) {
        std::cout << " " << num;
    }

    // std::endl is rarely good when you only want to output a newline.
    // It'll flush the buffer with is costly.
    // Make a habit of using "\n" in most cases.

    std::cout << "\n";
}
0 голосов
/ 06 февраля 2019

Одна проблема в вашем коде состоит в том, что цикл, подобный

for(i = 0; i < 4; i++){
    cin >> myArray[i];
}

, в конечном итоге будет i==4.Следовательно, return myArray[i] превысит границы массива и / или получит доступ к неинициализированному значению и приведет к неопределенному поведению.

Основная проблема, однако, заключается в том, что в C ++ вы будете придерживаться совершенно другого подхода и будете использовать типы коллекций, такие как std::vector вместо простых массивов.Смотрите следующий код, иллюстрирующий это.Надеюсь, это поможет.

#include <vector>
#include <iostream>

std::vector<int> getFourNums(){

    int val;
    std::vector<int> result;
    cout << "Enter 4 nums: ";
    for(int i = 0; i < 4; i++){
        cin >> val;
        result.push_back(val);
    }
    return result;
}

int main(int argc, char** argv){
    std::vector<int> fourNums = getFourNums();
    for (auto i : fourNums) {
        cout << i << endl;
    }
}
...