使用指针进行用户输入

时间:2010-02-20 20:15:58

标签: c++ pointers arrays

我正在努力使用指针,而不是使用数组表示法。所以我有一个函数来读取用户输入并返回指向该数组的指针。我可以这样做,似乎工作正常:

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进入p。那是为什么?

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

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

4 个答案:

答案 0 :(得分:2)

看到这是C ++,你考虑过了吗?

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

您可以使用iostream类来代替scanf。你应该看看它!

答案 1 :(得分:0)

嗯,p = newPtr;?

答案 2 :(得分: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;
}

答案 3 :(得分:0)

一些提示:


第一个GetValues分配newPtr(在函数中没有声明,是一个全局变量吗?)但是它没有做任何事情。您的函数可以通过两种方式处理内存存储:

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

    float * GetValues(float * array,size_t arraySize)

    更清楚地说明论点的性质。您无需在函数内部分配任何内容。

  2. 该函数应该自己分配所需的内存,让调用者在一段时间后释放内存。在这种情况下,你必须在它分配内存的函数名称中有某种提示。否则,您在维护此代码方面遇到了灾难,因为在释放内存时会出错很容易。你不需要传递一个指向函数的数组指针,但如果你这样做,它需要是一个双指针,它有任何意义(C和C ++按值传递参数,所以不可能改变一个指针,这是作为论点传递)

    float * GetValuesAndAllocateMemmory(size_t n)

    float * GetValuesAndAllocateMemmory(float ** array_pp,size_t n)


  3. 第二个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个浮点数超过{p>,则会崩溃。 永远不要信任用户输入数据,即使它来自您自己。始终验证。搜索术语“输入验证”以获取更多相关信息。

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