计算本地数组中的元素
Counting the elements in a local array
我有一个 double x[12]
其中没有任何元素。当提示用户时,he/she 输入一个数字,该数字存储在 x
中。
我希望程序首先检查x
是否为空,如果是,则将用户输入放入x[0]
,否则,将用户输入放入下一个空闲指数.
我这样做了:
...
double x[12];
void AddPayment(double Amount)
{
int i = sizeof(x);
x[i] = Amount;
}
是否 sizeof() 不适用于数组,是否有更好的方法?
当sizeof
应用于一个数组时,它不会告诉你这个数组有多少数据;它告诉您数组 可以 保存多少数据。您没有指定要放入 double x[12]
的任何数据这一事实对数组的大小没有影响。因此,sizeof
将 return 您的系统需要的字节数来容纳十二 double
个数组。
如果您想统计 12 项中有多少项已分配,请为其添加一个单独的变量。将其初始化为零,并使用它来跟踪已插入的项目数:
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() 运算符并不是实现您的目标的好方法。
最好的做法是用用户无法输入的值(比如 0)初始化 x[12],然后测试数组中第一个可用位置输入该值的零。
double x[12] = { 0 };
void AddPayment(double Amount)
{
for (int i = 0; i < 12; i++) {
if (x[i] == 0) {
x[i] = Amount;
break;
}
}
}
I have a double x[12]
which has no elements in it.
这是一种误解。 double x[12];
创建 12 个 double
元素,使它们的值处于未定义状态。所以你有 12 个未初始化的元素。这与 没有 元素完全不同。
(如果你有一个 std::string
类型的数组,这个误解会变得更加清晰。与 double
不同,std::string
总是初始化为一个定义的值,一个空字符串。所以 std::string x[12]
肯定是 12 个字符串,而不是一个空数组。)
When the user is prompted, he/she enters a number, which is stored in
x
.
I want the program to first check if x
is empty and if it is, put the
user's input in x[0]
or if it isn't, put the user's input in the next
free index.
我真的很惊讶没有人提出这个建议,但是数组对于你想要完成的事情来说是错误的工具。您需要一个可以 增长 的容器。你需要 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
。
我有一个 double x[12]
其中没有任何元素。当提示用户时,he/she 输入一个数字,该数字存储在 x
中。
我希望程序首先检查x
是否为空,如果是,则将用户输入放入x[0]
,否则,将用户输入放入下一个空闲指数.
我这样做了:
...
double x[12];
void AddPayment(double Amount)
{
int i = sizeof(x);
x[i] = Amount;
}
是否 sizeof() 不适用于数组,是否有更好的方法?
当sizeof
应用于一个数组时,它不会告诉你这个数组有多少数据;它告诉您数组 可以 保存多少数据。您没有指定要放入 double x[12]
的任何数据这一事实对数组的大小没有影响。因此,sizeof
将 return 您的系统需要的字节数来容纳十二 double
个数组。
如果您想统计 12 项中有多少项已分配,请为其添加一个单独的变量。将其初始化为零,并使用它来跟踪已插入的项目数:
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() 运算符并不是实现您的目标的好方法。
最好的做法是用用户无法输入的值(比如 0)初始化 x[12],然后测试数组中第一个可用位置输入该值的零。
double x[12] = { 0 };
void AddPayment(double Amount)
{
for (int i = 0; i < 12; i++) {
if (x[i] == 0) {
x[i] = Amount;
break;
}
}
}
I have a
double x[12]
which has no elements in it.
这是一种误解。 double x[12];
创建 12 个 double
元素,使它们的值处于未定义状态。所以你有 12 个未初始化的元素。这与 没有 元素完全不同。
(如果你有一个 std::string
类型的数组,这个误解会变得更加清晰。与 double
不同,std::string
总是初始化为一个定义的值,一个空字符串。所以 std::string x[12]
肯定是 12 个字符串,而不是一个空数组。)
When the user is prompted, he/she enters a number, which is stored in
x
.I want the program to first check if
x
is empty and if it is, put the user's input inx[0]
or if it isn't, put the user's input in the next free index.
我真的很惊讶没有人提出这个建议,但是数组对于你想要完成的事情来说是错误的工具。您需要一个可以 增长 的容器。你需要 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
。