所以,我一直在尝试创建一个只需要一个空数组和一个大小的简单程序,并用1到指定数字的数字填充它。
#include <iostream>
using namespace std;
int* fill(int empty[], int size) {
int i;
for (i = 1; i < size; i++) {
empty[i] = i;
}
return empty;
}
int main() {
int size;
cin >> size;
int* empty = new int[size];
fill(empty, size);
for (int i = 0; i < size; i++) {
cout << empty[i] << endl;
}
return 0;
}
那就是我的代码。 当int i,fill()方法为0时,它完全正常,但我想从1开始数字,当我这样做时,它看起来像这样:
-842150451
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
注意它是如何用一个奇怪的负数替换0的?这是我输入'30'作为我的数组大小。
当我将i的值设置为0时,它只是将该负值替换为0。 有没有办法只在一个数组启动数组?
感谢。
答案 0 :(得分:0)
如果你想让数组中的数字开始保持循环从0开始(因为C ++中的数组基于零)并且只是将值设置为i + 1
而不是简单地i
:< / p>
int* fill(int empty[], int size) {
int i;
for (i = 0; i < size; i++) {
empty[i] = i + 1;
}
return empty;
}
答案 1 :(得分:0)
您正在从索引1开始填充数组,但是从索引0开始输出它。您期望什么?
有没有办法只在一个位置启动数组?
是。如果您需要size
个元素,并且由于某种原因需要它们从索引1开始,那么您将分配一个 extra 元素:
int* empty = new int[size + 1];
现在你在所有后续操作*中忽略元素0。您还可以迭代并包含 size
:
for (i = 1; i <= size; i++) {
empty[i] = i;
}
我会警告你,如果你只是这样做是因为你有一种非理性的恐惧,那么你应该克服那种恐惧并编写其他C ++程序员可以理解的代码。在没有充分理由的情况下从1开始数组是草率的,并且会让任何读取代码的人烦恼。
如果这只是你想要数字从1开始,但是数组索引从零开始,这是另一回事。填写时只需加1即可。
请注意,标准库中已有一个功能。它位于<numeric>
,称为std::iota
:
std::iota( empty, empty + size, 1 );
答案 2 :(得分:0)
怎么样?
int* fill(int empty[], int size) {
int i;
for (i = 0; i < size; i++) {
empty[i] = i + 1; // one more than the index
}
return empty;
}
您需要将值设置为一个而不是数组索引。因此,数组索引从0 - size - 1
计算,而值(i + 1
)从1 - size
开始计算。
答案 3 :(得分:-2)
您应该知道数组的下标从0
开始到size - 1
。例如:
int a[10]; // The subscript is from a[0] to a[9]
如果你想要一个大小为sz
且下标从1
开始的数组,你可以这样做
constexpr int sz = 10;
int a[sz + 1];
然后,只使用从1
到sz
的下标范围,然后忽略0
。