2010-02-20 76 views
0

我试图更好地使用指针,而不是使用数组符号。所以我有一个函数来读取用户输入并返回一个指向该数组的指针。我能做到这样,它似乎确定工作:用指针输入用户输入

float *GetValues(float *p, size_t n) 
{ 

    float input; 
    int i = 0; 

    if ((newPtr = (float *)malloc(n * sizeof(float))) == NULL) { 
     cout << "Not enough memory\n"; 
     exit(EXIT_FAILURE); 
    } 
    cout << "Enter " << n << " float values separated by whitespace: \n"; 

    while (scanf("%f", &input) == 1) { 
     p[i] = input; 
     i++; 
     cout << *p; 
    } 
    return p; 
} 

不过,如果我这样做:

float *GetValues(float *p, size_t n) 
{ 
    float *newPtr; 
    float input; 

    if ((newPtr = (float *)malloc(n * sizeof(float))) == NULL) { 
     cout << "Not enough memory\n"; 
     exit(EXIT_FAILURE); 
    } 
    cout << "Enter " << n << " float values separated by whitespace: \n"; 

    while (scanf("%f", &input) == 1) { 
      *newPtr++ = input; 
    } 
    return newPtr; 
} 

我得到的只是0进入页。这是为什么?

此外,我必须在这里分配内存大小为n的数组吗?我首先尝试用上面的方法使用指针,而不是分配内存,但只是设置p =输入,我得到垃圾值。谢谢!

编辑:对不起,我分配了一个新的ptr,并且像你说的那样返回了错误的。我只是试图将数字输入到指针中,然后将其显示在屏幕上,并且没有注意返回类型,并且当我输出0时,输出为0。

+0

你传递'p',你回'p',可以分配别的东西叫'newPtr',什么也不做它......它可能是更容易,如果你重新开始,只有把东西放到了需要在那里解决你的问题的代码。 – 2010-02-20 20:20:32

回答

0

一些提示:


第一的GetValues分配NEWPTR(这是不是函数内声明,全局变量?),但最后还是与它无关。有两种可能的方式,你的函数可以与问候合作,记忆存储:

  1. 的函数得到一个指向有效的内存大小足够大的数组。在这种情况下,函数的签名应该是

    浮子*的GetValues(浮子*阵列,为size_t ARRAYSIZE)

    以更清楚地说明的参数的性质。你不需要在函数内部分配任何东西。

  2. 函数应该自己分配所需的内存,并让调用者稍后释放内存。在这种情况下,你必须在它分配内存的函数的名字中提供某种提示。否则,在维护这些代码方面你会遇到一些灾难,因为在释放内存方面犯错是非常容易的。你不需要传递一个数组指针给函数,但是如果你这样做的话,它需要是一个双指针,它有任何意义(C和C++通过值传递参数,所以不可能改变一个指针,它是作为一个参数)传递

    浮子* GetValuesAndAllocateMemmory(为size_t N)

    浮子* GetValuesAndAllocateMemmory(浮** array_pp,为size_t N)


在第二的GetValues的回路应

float *start_p = p; 
... 
while (scanf("%f", &input) == 1) { 
     *p++ = input; 
     cout << *start_p; 
} 
return start_p; 

为了与第一个GetValues相同。


这里就有的浮点值的数量是n上限,但您的代码不检查这个

cout << "Enter " << n << " float values separated by whitespace: \n"; 
while (scanf("%f", &input) == 1) { 

并且如果输入了多个n花车会崩溃。 永远不要相信用户输入数据,即使它来自你自己。始终验证。搜索术语“输入验证”以获取更多关于此的信息。

cout << "Enter " << n << " float values separated by whitespace: \n"; 
entered_values = 0; 
while (entered_values < n && scanf("%f", &input) == 1) { 
     entered_values++; 
+0

你为什么要声明start_p = p? – Crystal 2010-02-20 22:56:50

+0

'start_p'变量记住数组的开始。在函数结束时,'p'变量将指向最后一个元素,因为它在循环中每次都增加。 – hlovdal 2010-02-21 01:05:12

+0

但是通过设置两个指针,它们是不是指向相同的东西,所以start_p也会移动? – Crystal 2010-02-21 01:08:29

0

嗯,p = newPtr;?

+1

OP对指针的使用显然没有经验,因此可能需要了解更全面的解释 – zebrabox 2010-02-20 20:20:18

+0

@zebrabox代码非常错误,我不知道从哪里开始尝试给出“更全面的解释”。所以我坚持了这个问题的基本事实,并等待OP的回归。 – bmargulies 2010-02-20 20:29:52

2

看到,因为这是C++,你有没有考虑:

void GetValues(std::vector<float> &values) 
{ 
    float input; 
    while (scanf("%f", &input) == 1) { 
     values.push_back(input); 
    } 
} 

而且还有一些所谓的iostream类,您可以用它代替scanf。你应该检查一下!

+0

因为我们还没有接触过载体,所以我还没有。 – Crystal 2010-02-20 20:41:36

+1

这听起来像你被教C,而不是C++。这是一种现在很少实行的残酷行为。 – 2010-02-20 20:49:30

+0

而且经常练习太多。但它教C++就好像它是C,而不仅仅是教C,那就是问题所在。 – 2010-02-20 21:56:25

0

你甚至不存储任何值在p。并且您将返回您作为参数传递的指针,这不是必需的。一个更好的版本是:

long GetValues(float *p, size_t max) 
{ 
    float input; 
    long i; 

    cout << "Enter at the most " << max << " float values separated by whitespace: \n"; 

    for(i = 0; i < max && scanf("%f", &input) == 1; ++i) 
    { 
     p[i] = input; 
    } 

    // Return the number of parsed numbers 
    return i; 
}