【问题标题】:C++ Loops not starting with 0不以 0 开头的 C++ 循环
【发布时间】:2016-01-28 02:15:11
【问题描述】:

所以,我一直在尝试创建一个简单的程序,它只需要一个空数组和一个大小,并用从 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。 有什么方法可以从一个数组开始?

谢谢。

【问题讨论】:

  • empty[0] 只是未初始化。
  • for (i = 1; i &lt; size; i++) {
  • 如果填充数组时从1开始,打印时也应该从1开始。
  • c/c++ 中数组的第一个索引始终为 0。您无法更改它。无论如何最好从 0 开始数组。
  • 我不会否决这个问题。当你使用基于索引的数组时,你应该小心。考虑是否可以使用其他数据结构。

标签: c++ arrays loops


【解决方案1】:

您从索引 1 开始填充数组,然后从索引 0 开始输出它。您期望什么?

有没有什么办法让数组从一个开始?

是的。如果您需要 size 元素并且出于某种原因需要它们从索引 1 开始,那么您分配一个 extra 元素:

int* empty = new int[size + 1];

现在您在所有后续操作中忽略元素 0*。您还可以迭代到 并包括 size:

for (i = 1; i <= size; i++) {
    empty[i] = i;
}
  • 不过,我仍会将其初始化为 something

我会警告您,如果您只是因为对零的非理性恐惧而这样做,那么您应该克服这种恐惧并编写其他 C++ 程序员可以理解的代码。没有充分理由从 1 开始数组是草率的,并且会惹恼任何阅读您的代码的人。

如果这只是您想要从 1 开始的 数字 而数组索引从零开始的问题,那是另一回事。填的时候加1就好了。

请注意,标准库中已经为此提供了一个函数。它在&lt;numeric&gt; 中,被称为std::iota

std::iota( empty, empty + size, 1 );

【讨论】:

  • 我认为是填充数组的数字,他想从1 开始,而不是数组索引。
  • 是的,我意识到这一点并编辑了我的答案。我想我可以把数组索引的东西拿出来。
【解决方案2】:

怎么样?

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】:

    如果你想让数组中的数字开始保持循环从 0 开始(因为 C++ 中的数组是从零开始的),只需将值设置为 i + 1 而不是简单的 i

    int* fill(int empty[], int size) {
        int i;
        for (i = 0; i < size; i++) {
            empty[i] = i + 1;
        }
       return empty;
    }
    

    【讨论】:

    • 来自问题:当int i,在fill()方法中为0时,它工作得非常好,但我想从1开始数字。您的回答如何解决?
    • OP 想要从 1 开始数组中的数字 - 数组从零开始(像往常一样) - 所以解决方案只是将元素设置为 i+1
    • 啊,我没看到。您应该更新答案以说明您在做什么以及它如何解决问题。
    【解决方案4】:

    您应该知道数组的下标从0size - 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-23
      • 2017-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多