-4

我是 C++ 新手,我创建了一个读取向量中元素的函数和一个打印元素的函数。问题是打印功能不能正常工作。

 #include <iostream>
    using namespace std;

1)

int read()
{
    int elements,i;
    cout<<"Give the number of elements:";
    cin>>elements;
    int v[elements];
    for(i=1;i<=elements;i++)
    {
        cout<<"v["<<i<<"]=";
        cin>>v[i];
    }
    return elements;
}

2)

void print_vector(int elements)
{
    int i;
    int v[elements];
    for(i=1;i<=elements;i++)
    {
        cout<<v[i];
    }
}

int main()
{
    int n=read();
    print_vector(n);
    return 0;
}

Example:
Give the number of elements:5
v[1]=1
v[2]=2
v[3]=3
v[4]=4
v[5]=5
1348

它打印 1348 而不是 12345。该功能有什么问题,如何修改它以打印正确的元素?

4

3 回答 3

3
int v[elements];

这将创建一个新的整数数组。

传递数组相对困难,因为您必须小心如何处理内存分配,并且它们可以追溯到过去的C.

在您学习C++的过程中,您可以使用 aclass来管理内存问题。std::vector在语法上类似于数组,但会为您处理分配和调整大小,并记住它的大小。

您可以通过引用将对象传递给函数&,并且在函数内部可以修改传入的对象,并在函数完成后具有持久效果。

void read(vector<int>& elements) {
    // in here you can resize the vector
}

void print(const vector<int>& elements) {
    // passing in elements by const reference means you can't modify it
}

总而言之:

int main() {
    vector<int> elements;
    read(elements);
    print(elements);
}

或者,如果你想成为面向对象的,你应该寻找将数据和函数组合在一起的方法,这样你就可以完全避免传递数据。在这种情况下,您可以对向量以及读取和打印功能进行分组。也许叫它UserIntegers

class UserIntegers {
public:
    void process() {
        read();
        print();
    }
private:
    vector<int> numbers;
};

用法:

int main() {
    UserIntegers userIntegers;
    userIntegers.process();
}
于 2013-03-15T20:51:40.687 回答
2

read()中,您将元素读入本地数组v。当函数结束时,数组也会消失。同样的情况发生在print_vector().

另一个错误是数组的索引。您访问元素 from1elementsinclusive,它忽略第一个元素0并最终访问超出数组边界的一个元素 ( elements)。

您需要在std::vector两个函数之外分配一个数组,更好的是 a ,并将其传递read()给填充和print_vector()打印。

#include <iostream>
#include <vector>

void read(std::vector<int> &v)
{
    int elements,i, n;
    std::cout<<"Give the number of elements:";
    std::cin>>elements;
    for(i = 0; i < elements; i++)
    {
        std::cout<<"v["<<i<<"]=";
        std::cin>> n;
        v.push_back(n);
    }
}

void print_vector(const std::vector<int> &v)
{
    for(auto i = v.begin(); i != v.end(); ++i)
    {
        std::cout << *i;
    }
}

int main()
{
    std::vector<int> v;
    read(v);
    print_vector(v);
    return 0;
}
于 2013-03-15T21:15:30.693 回答
2

您的打印功能有错误

for(i=1;i<=elements;i++)
{                   //^^^^^
    cout<<v[i];
    ++i;  //You would like to skip some elements?
}

您将索引 i 增加两次,数组索引从 0 开始,而不是 1;它以数字(elements-1)而不是元素结尾,同时,您使用的是数组,而不是向量。

于 2013-03-15T20:49:27.563 回答