2010-09-09 78 views
1
#include <iostream> 
using namespace std; 

int main(){ 
    int findMax(int *); 

    const int MAX = 100; 
    int values[MAX]; 
    char ivals[256]; 
    // Get the space-separated values from user input. 
    cin.getline(ivals, 256, '0'); 
    char *helper; 
    // Clean input array and transfer it to values. 
    for(int i = 0; i < (MAX) && ivals[i] != 0; i++){ 
     helper = ivals[i * 2]; 
      values[i] = atoi(helper); 

    } 

    int mval = findMax(values); 
    cout << values << endl << mval; 
    return 0; 
} 
//Function to find the maximum value in the array 
int findMax(int arr[]){ 
    int localmax = 0; 
    for(int i = 0; i < (sizeof(arr)/sizeof(int)); i++){ 
     if(arr[i] > localmax){ 
      localmax = arr[i]; 
     } 
    } 
    return localmax; 
} 

該程序的目的是爲用戶輸入一個由0結尾的以空格分隔的值序列。然後要分析該數組以查找最大值。我想出如何轉換的是原本一個char []爲一個int [],這樣我可以使用findMax()函數就可以了,而不錯誤,但排序循環似乎有它自己的問題,當「COUT < <值< < endl < < mval;「被調用時,它只返回一個內存地址,而不是應該是非間隔的整數序列。任何人都可以解釋我做錯了什麼嗎?看來我可能使用指針犯了一些錯誤,但我無法弄清楚什麼。C++程序顯然是打印內存地址而不是陣列

+0

相關:http://stackoverflow.com/questions/2037736/finding-size-of-int-array/和http://stackoverflow.com/questions/1975128/sizeof-an-array-in -aa -c-programming-language/ – 2010-09-09 16:59:44

+1

@aaa鯉魚:再一次:一個數組不是一個指針,它具有不同的類型,大小......語言執行從數組到數組中的第一個元素的自動轉換數組,但就是這樣。說一個數組是一個指針就像是說int是一個double,只是因爲int i = 10; double d = i;'編譯。 – 2010-09-10 09:01:22

回答

2

當傳遞給函數時,int的數組被提升爲指向int的指針。採用普通陣列沒有運營商< <。如果您想以這種方式使用運算符< <,則需要使用std :: vector。

注意:從技術上講,在傳遞給使用模板的函數時可以區分數組,但這不適用於標準運算符< <。

7

打印values不會打印像您期望的數組中的內容,將打印數組的第一個元素的存儲位置。

嘗試這樣代替:

#include <iterator> 
#include <algorithm> 

// ... 

copy(&values[0], &values[MAX], ostream_iterator(cout, " ")); 

對不起,我不能張貼實際工作的代碼,但原來的職位是有許多語法和句法錯誤一團糟。

編輯:爲了更加完整和更平易近人的興趣,我寫了一個小程序,說明了4種方法來實現這一點。

方法1使用copyostream_iterator,因爲我之前所做的那樣。 下面的方法2可能是最基本的&最容易理解。方法3是一個C++ 0x方法。我知道這個問題被標記爲C++,但我認爲這可能是教育添加此。方法4是使用vectorfor_each的C++方法。我已經實現了一個可以進行傾倒的函子。

分享&享受這裏

#include <iostream> 
#include <iterator> 
#include <algorithm> 
#include <functional> 
#include <vector> 
using namespace std; 

struct dump_val : public unary_function<int,void> 
{ 
    void operator()(int val) 
    { 
     cout << val << " "; 
    } 
}; 

int main(){ 
    int vals[5] = {1,2,3,4,5}; 


    // version 1, using std::copy and ostream_iterator 
    copy(&vals[0], &vals[5], ostream_iterator<int>(cout, " ")); 
    cout << endl; 

    // version 2, using a simple hand-written loop 
    for(size_t i = 0; i < 5; ++i) 
     cout << vals[i] << " "; 
    cout << endl; 

    // version 3, using C++0x lambdas 
    for_each(&vals[0], &vals[5], [](int val) 
    { 
     cout << val << " "; 
    } 
    ); 
    cout << endl; 

    // version 4, with elements in a vector and calling a functor from for_each 
    vector<int> vals_vec; 
    vals_vec.push_back(1); 
    vals_vec.push_back(2); 
    vals_vec.push_back(3); 
    vals_vec.push_back(4); 
    vals_vec.push_back(5); 
    for_each(vals_vec.begin(), vals_vec.end(), dump_val()); 
    cout << endl; 

} 
+3

+1對於使用標準庫,但這可能不是初學者最簡單的方法:) – luke 2010-09-09 17:00:17

+5

取決於您對「簡單」的定義。 :)就我個人而言,我通常會發現使用STL的算法比製作手寫循環更容易和更簡單。我確實承認,很多C++程序員都不知道'copy'可以這種方式使用,但是。 – 2010-09-09 17:02:18

2
for(int i = 0; i < (sizeof(arr)/sizeof(int)); i++){ 

的sizeof(ARR)是指針陣列的大小。 C++不會傳遞實際的數組,這將是非常低效的。你通常只能通過循環一次。聲明你的功能是這樣的:

int findMax(int* arr, size_t elements) { 
    //... 
} 

但是,真的,使用一個向量。

哦,掛在,問題。遍歷數組並打印每個單獨的元素。

3

當您通過X周圍的數組這真是一個指針X的數組,你身邊掠過。所以當你通過values去cout時,它只有指針可以打印出來。

你真的應該考慮使用一些標準算法來讓你的生活更簡單。

例如打印在陣列中的所有元素,你可以只寫

std::copy(values, values+MAX, std::ostream_iterator<int>(std::cout, "\n")); 

要找到最大元素,你可以只寫

int mval = *std::max_element(values, values+MAX); 

所以,你的代碼變得

#include <iostream> 
using namespace std; 

int main(){ 

    const int MAX = 100; 
    int values[MAX]; 
    char ivals[256]; 
    // Get the space-separated values from user input. 
    cin.getline(ivals, 256, '0'); 
    char *helper; 
    // Clean input array and transfer it to values. 
    for(int i = 0; i < (MAX) && ivals[i] != 0; i++){ 
     helper = ivals[i * 2]; 
      values[i] = atoi(helper); 

    } 

    copy(values, values+MAX, ostream_iterator<int>(cout, "\n")); 
    cout << *std::max_element(values, values+MAX); 
    return 0; 
} 

這樣做完全不需要您的findMax方法。

我也會重新編寫代碼,以便使用矢量而不是數組。這使得你的代碼更短。您可以使用stringstream將字符串轉換爲數字。

像這樣的東西應該可以工作,並且比原來的代碼少很多。

int main(){ 


    vector<int> values; 
    char ivals[256]; 

    // Get the space-separated values from user input. 
    cin.getline(ivals, 256, '0'); 

    int temp = 0; 
    stringstream ss(ivals); 
    //read the next int out of the stream and put it in temp 
    while(ss >> temp) { 
     //add temp to the vector of ints 
     values.push_back(temp); 
    } 

    copy(values.begin(), values.end(), ostream_iterator<int>(cout, "\n")); 
    cout << *std::max_element(values.begin(), values.end()); 
    return 0; 
} 
+2

對於'std :: max_element'爲+1 - 這就是代碼應該如何寫在第一位。 – 2010-09-09 17:06:00