C ++循环不以0开头

时间:2016-01-28 02:15:12

标签: c++ arrays loops

所以,我一直在尝试创建一个只需要一个空数组和一个大小的简单程序,并用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。 有没有办法只在一个数组启动数组?

感谢。

4 个答案:

答案 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];

然后,只使用从1sz的下标范围,然后忽略0