2010-09-09 57 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

相关问题