2013-03-15 74 views
-3

我是C++的新手,我製作了一個讀取矢量元素和打印元素的函數的函數。問題是打印功能不能正常工作。在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。什麼是錯的功能以及如何修改它打印正確的要素是什麼?

+3

您的代碼使用的是編譯器擴展。使用'std :: vector'來代替那個可變長度的數組。 – chris 2013-03-15 20:49:00

+3

請閱讀[whathaveyoutried.com](http://whathaveyoutried.com)並遵循建議。 – djechlin 2013-03-15 20:49:01

回答

2

你有錯誤,在你的打印功能

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

您遞增索引i兩次,數組索引從0開始,而不是1;它以數字(元素-1)而非元素結尾,與此同時,您使用的是數組,而不是矢量。

3
int v[elements]; 

這創建了一個新的整數數組。

在數組中傳遞是相對困難的,因爲您必須小心如何處理內存分配,並且他們回到過去的C

當您在學習C++時,您可以使用class來管理內存問題。 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(); 
} 
+0

我應該如何設計打印功能,使其不會創建新的整數數組? – 2013-03-15 20:55:03

2

read(),你讀的元素融入本地陣列v。當函數結束時,數組也將消失。 print_vector()也是如此。

另一個錯誤是你的數組索引。您可以訪問從1elements(含)的元素,這會忽略第一個元素0並最終訪問數組邊界之外的一個元素(elements)。

您需要在兩個函數之外分配一個數組,最好是std::vector,並將其傳遞到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; 
} 
+0

我想你是缺少std :: vector – 2013-03-15 21:49:21

+0

@JorgeNúñez的模板參數謝謝你,我錯過了。固定。 – 2013-03-15 21:52:19