在c ++中获取未知大小的数组

时间:2014-04-13 21:40:57

标签: c++ arrays

好的我对编程非常陌生,我正在学习c ++课程。基本上对于当前项目,我必须采用未知大小的数组,调整大小,并输出一组统计数据,如平均值,Q1,Q3等。我无法从用户那里获取数组。一旦他们输入0,我就需要退出变量。这就是我所拥有的:

int i = 1; //When I first posted this I didn't mean to comment out the '= 1' part
do {
    cin >> array[i];
    if (array[i] != 0)
        return true;
} while (true);

我做错了什么?无论我输入什么号码,每次输入1个号码后程序都会停止。

我正在使用矢量类btw。

4 个答案:

答案 0 :(得分:2)

执行以下操作:

// change int to your type
int val;
std::vector<int> vec; 
while(std::cin >> val) {
  if(val == 0) break;
  vec.push_back(val);
}

原因:声明一个return子句导致退出循环。

使用std::vector可确保任意大小条件。

@ nonsensickle的建设性评论后更新:

以下代码也确保仅0终止输入过程条件:

// change int to your type
int val;
std::vector<int> vec; 
do {
  if(std::cin >> val) {
    if(val == 0) break;
    vec.push_back(val);
  } else { // fix broken input stream in case of bad input
    std::cin.clear();
    std::cin.ignore(1,'\n');
  }
} while(true);

和更复杂的方式,虽然矫枉过正,但到底是什么:),模板和类型特征:

template <typename T> 
struct zero_traits
{
  static T getzero() { return T(0); }
};

template <>
struct zero_traits<std::string> 
{
  static std::string getzero() { return "0"; }
};

template <>
struct zero_traits<char> 
{
  static char getzero() { return '0'; }
};

template <typename T>
std::vector<T> read_values()
{
  T val;
  std::vector<T> vec; 
  do {
    if(std::cin >> val) {
      if(val == zero_traits<T>::getzero()) break;
      vec.push_back(val);
    } else {
      std::cin.clear();
      std::cin.ignore(1,'\n');
    }
  } while(true);
  return vec;
}

int main()
{
// change int to your type
std::vector<int> vec = read_values<int>();
for(auto i : vec) std::cout << i << std::endl;
}

答案 1 :(得分:1)

首先i永远不会增加。

其次,如果该数组的值不等于0,if (array[i] != 0)return

您需要了解do { ... } while()循环的工作方式以及return语句的工作方式。当你在它的时候,还可以投入如何增加数组。

答案 2 :(得分:1)

在回答你的问题之前。

  1. 初始化变量int i=0;。您将i指定为零,因为数组零索引
  2. 你必须进行i。如果不增加它,i将始终指向数组中的第一个“桶”。在 do while 循环的每次迭代后使用i++i = i + 1在阵列中向前移动。
  3. 您希望程序运行直到输入零,因此您必须编写类似if (array[i] == 0) return true;的条件。当输入的最后一个数字为零并且它将导致您的方法返回时,此条件为真。在while子句中检查它会更优雅。
  4. 总而言之,您的代码应如下所示

    int i=0;
    do {
        cin >> array[i];
        if (array[i] != 0) break;
        i++;
    } while (i < maxSize);
    //do stuff with filled array
    

答案 3 :(得分:1)

我不会试图直接回答你的问题。你所拥有的是一个小的逻辑错误和对do {...} while ()循环结构的误解。您需要学习如何逐步完成代码。

让我们逐行浏览你的代码(这里只有6行,所以它应该非常简单):

  1. int i; - 好的,我们在这里声明一个整数i,但没有给它一个值。因此,i可以具有随机值。
  2. do { - 在我们评估while子句时,我们将回到这里。但只有while子句的结果是true
  3. cin >> array[i] - 存储用户在位置array的{​​{1}}中输入的值。在这里,我们问自己一个问题,什么是i ?我们应该知道它的价值,而不必运行程序。 提示:由于i
  4. ,此处存在问题
  5. i - 如果用户输入的数字不为零 if (array[i] != 0)(退出此功能并显示结果return true)。
  6. true - 返回} while (true);行并重做所有步骤,直至到达此处。 这里没有任何条件,所以它会一直发生,直到我们退出此功能
  7. 提示:循环的唯一退出点是步骤4。

    有了这个,你应该能够找出问题所在。试图为自己解决问题应该是你迈出的第一步。

    我建议在调试小程序时阅读this blog post。它应该是提供信息。

    虽然其他人(特别是@DimitriosBouzas)发布的代码可以使用,并且是更好的选择,但我强烈建议修复代码并了解失败的原因。从长远来看,这将比@DimitriosBouzas的优雅解决方案更有帮助。