【问题标题】:Vector Storing Incoherent Data存储不连贯数据的向量
【发布时间】:2019-05-04 21:50:30
【问题描述】:

我正在关注 Programming: Principals and Practices C+ 中的一个示例,但是当我尝试显示矢量时,我得到的基本上是噪声(序列中的随机数)。任何帮助将不胜感激。

我尝试过使用数据类型(int、unsigned int),最后使用 endl 而不是 \n,并进行了细微的语法更改。似乎没有任何效果

std::vector<double>sumbank;
int vectorsize = 0;

std::cout << "Enter amount of digits you will be storing \n";
std::cin >> vectorsize;
for (unsigned int a=0; a < vectorsize; ++a)
{
    double sum = 0;
    std::cout << "Please Enter Your First Number\n";
    std::cin >> sum;
    sumbank.push_back(sum);

}

for (unsigned int b = 0; b < sumbank.size(); ++b)
{
    std::cout << sumbank[b] << '/n';
}

【问题讨论】:

  • 调试程序,判断问题是读取错误、存储错误还是打印错误。我的猜测是它们被正确读取和存储,但打印不正确。注意'/n' 中的反斜杠。
  • "...endl 而不是 \n 最后..." 你确定你试过std::endl\n 但它们没有用吗?
  • /n 工作我切换了方向,但是没有 endl 不起作用。我一定也搞砸了那里的语法,现在研究一下,看看我是否可以让它与 endl 一起工作
  • "/n works" 它不应该。向我们展示您如何使用std::endl,但它失败了。
  • @FuzMunkey 如果您输入有效值,您将不会有随机数,如果您输入无效,您将有,因为您没有清除错误也没有绕过无效输入

标签: c++ vector


【解决方案1】:

std::cout << sumbank[b] << '/n';

你的换行错误,必须是 '\n' 或更好的 std::endl

您的留言

 std::cout << "Enter amount of digits you will be storing \n";

为什么是数字?你输入双倍

 std::cout << "Please Enter Your First Number\n";

为什么是“第一”?

您还可以混合使用有符号和无符号数来比较

我鼓励你检查你的输入是否成功,所以if (! (cin &gt;&gt; var)) ...error... 否则如果你输入了一个无效的值,那么接下来的所有输入都不会做任何事情


编辑您的评论“我试图了解刷新缓冲区的作用,它是如何工作的,以及它为什么有用”:

拥有

int vectorsize = 0;

std::cin >> vectorsize;

如果输入了数字以外的其他内容,则流有错误,并且您无法在该状态下成功读取它,因此要再次读取数字,您需要清除错误,当然还要绕过无效流中仍然存在的输入。

因为您在代码中读取了多个数字,所以有一个专门的函数来不重复代码会很有用,它可以是:

#include <iostream>

// return false in case of EOF, else true
bool readInt(std::istream & is, int & v)
{
  while (! (is >> v)) {
    // clear error
    is.clear();

    // bypass invalid input
    std::string s;

    if (!(is >> s)) {
      // end of file 
      return false;
    }

    std::cerr << "invalid number ('" << s << "'), redo" << std::endl;
  }

  return true;
}

int main()
{
  int v;

  std::cout << "enter an integer : ";
  if (!readInt(std::cin, v))
    std::cout << "EOF!" << std::endl;
  else
    std::cout << "the number is " << v << std::endl;
}

编译和执行:

pi@raspberrypi:/tmp $ g++ -pedantic -Wextra -Wall c.cc
pi@raspberrypi:/tmp $ ./a.out
enter an integer : aze
invalid number ('aze'), redo
23
the number is 23
pi@raspberrypi:/tmp $ echo "aze qsd" | ./a.out
enter an integer : invalid number ('aze'), redo
invalid number ('qsd'), redo
EOF!
pi@raspberrypi:/tmp $ 

当然你也可以定义一个模板函数不限于int

#include <iostream>

// return false in case of EOF, else true
template <typename T>
bool readIt(std::istream & is, T & v)
{
  while (! (is >> v)) {
    // clear error
    is.clear();

    // bypass invalid input
    std::string s;

    if (!(is >> s)) {
      // end of file 
      return false;
    }

    std::cerr << "invalid input ('" << s << "'), redo" << std::endl;
  }

  return true;
}

int main()
{
  int v;

  std::cout << "enter an integer : ";
  if (!readIt(std::cin, v)) {
    std::cout << "EOF!" << std::endl;
    return -1;
  }
  else
    std::cout << "the integer is " << v << std::endl;

  float f;

  std::cout << "enter a float : ";
  if (!readIt(std::cin, f)) {
    std::cout << "EOF!" << std::endl;
    return -1;
  }
  else
    std::cout << "the float is " << f << std::endl;

  return 0;
}

编译和执行:

pi@raspberrypi:/tmp $ g++ -pedantic -Wextra -Wall t.cc
pi@raspberrypi:/tmp $ ./a.out
enter an integer : 12
the integer is 12
enter a float : 12.34
the float is 12.34
pi@raspberrypi:/tmp $ 
pi@raspberrypi:/tmp $ 
pi@raspberrypi:/tmp $ ./a.out
enter an integer : a
invalid input ('a'), redo
12
the integer is 12
enter a float : b
invalid input ('b'), redo
12.34
the float is 12.34

【讨论】:

猜你喜欢
  • 2017-02-23
  • 2021-10-07
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多