对局部数组中的元素进行计数

Counting the elements in a local array

本文关键字:元素 局部 数组      更新时间:2023-10-16

我有一个没有元素的double x[12]。当系统提示时,用户输入一个号码,该号码存储在x中。

我想让程序首先检查x是否为空,如果是,把用户的输入放在x[0]中,如果不是,把用户的输入放在下一个自由索引中。

我已经这样做了:

...
double x[12];
void AddPayment(double Amount)
{
    int i = sizeof(x);
    x[i] = Amount;
}

是sizeof()不与数组工作,有更好的方法做到这一点吗?

sizeof应用于数组时,它不会告诉你该数组保存了多少数据;它告诉您数组可以保存多少数据。您没有指定要放入double x[12]中的任何数据,这一事实对数组的大小没有影响。因此,sizeof将返回在您的系统中保存一个由12个double组成的数组所需的字节数。

如果您想记录12项中有多少项被分配,请为其添加一个单独的变量。将其初始化为0,并使用它来跟踪已插入的项的数量:

size_t x_count = 0;
double x[12];
void AddPayment(double Amount) {
    if (x_count == 12) {
        // Error; we cannot add more than 12 items.
        // Tell the user what's going on and quit,
        // or handle the error in some other way.
        cerr << "Cannot add more than 12 elements to x[]" << endl;
        return;
    }
    x[x_count++] = Amount;
}

无论x[12]是否有值,它的大小始终为12 * sizeof(double)。

因此,使用sizeof()运算符并不是达到目的的好方法。

最好的方法是将x[12]初始化为用户无法输入的值,例如0,然后测试数组中第一个可以输入该值的位置为0。

double x[12] = { 0 };
void AddPayment(double Amount)
{
    for (int i = 0; i < 12; i++) {
        if (x[i] == 0) {
            x[i] = Amount;
            break;
        }       
    }
}

我有一个没有元素的double x[12]

那是一种误解。double x[12];创建了12个double元素,使它们的值处于未定义状态。所以你有12个未初始化的元素。这与没有元素是完全不同的。

(例如,如果您有一个类型为std::string的数组,则误解会变得更加明显。与double不同,std::string总是初始化为一个定义值,一个空字符串。所以std::string x[12]肯定是12个字符串,而不是一个空数组。)

当系统提示时,用户输入一个号码,该号码存储在x .

我希望程序首先检查x是否为空,如果是,则将用户的输入在x[0]中,如果不是,则将用户的输入放在next中自由指数。

我真的很惊讶没有人建议这样做,但是对于你想要完成的任务来说,数组是错误的工具。您需要一个可以生长的容器。你需要std::vector:

std::vector<double> x; // starts off empty
void AddPayment(double Amount)
{
    x.push_back(Amount); // grows by 1 element
}

std::vector也有一个size()成员函数来告诉您当前元素的数量。不再需要sizeof