【问题标题】:Getting input from the user [duplicate]从用户那里获取输入[重复]
【发布时间】:2019-08-06 21:00:35
【问题描述】:

所以我正在看一个关于 C++ 的教程。他在解释一个节目对生日很重要。这些是条件。

1 - 18, 21, 50, > 65 : Important

All others are not important

他使用了以下代码:

std::string sAge = "0";
std::cout << "Enter your age : ";
getline(std::cin, sAge);
int nAge = std::stoi(sAge);

为什么不直接使用下面的代码而不是上面给出的代码来获取用户的输入?

int nAge;
std::cin >> nAge;

【问题讨论】:

  • 试一试,在提示输入时输入 X。
  • 我看不出原始代码的原因,除非您试图解释这些功能。
  • 还很大程度上取决于代码周围发生了什么。例如,如果您发现自己将&gt;&gt;getline 混在一起,您很可能会进入Why does std::getline() skip input after a formatted extraction?

标签: c++ input cin


【解决方案1】:

在使用 IO 流时,输入在 c++ 中是类型安全的。所以当你做类似的事情时

int nAge;
std::cin >> nAge;

编译器发现像std::istream&amp; std::cin::operator &gt;&gt;(int&amp; var) 这样的重载,因为它知道它正在使用int,所以它只会存储输入的int,即:5、-121、1235156141。它确实有一个主要的问题虽然。如果您输入了5a,那么它将获得int 部分,5,并将a 留在流中,因为它不是int。这可能对您的以下代码非常不利,因为现在有一个 a 只是坐在缓冲区中。如果您要求另一个int,那么这将失败,因为a 不是int

要解决此问题,您可以将输入作为std::string 输入,就像您在教程中看到的那样。当您这样做时,整个 5a 将从流中读取并放入字符串中。然后stoi 将得到int 部分,现在你有一个有效的int 和一个空流。

因此,总而言之,如果您想要更好的错误处理,请将您的输入作为std::string。它可以让您清除缓冲区并清理输入。当然,它的成本更高,但如果您正在处理输入,那么用户将不会注意到处理时间。

【讨论】:

  • 为什么不使用异常处理呢?这是在现实世界的程序中推荐的吗?还是使用异常处理?
  • @Maestro 你能澄清一下异常处理将如何应用在这里吗?
  • @Maestro 对 C++ 中的异常有很大的反感。它们也应该用于特殊场合。输入错误并没有什么特别的。用户一直在这样做。用正常的输入处理来处理它通常是他们处理错误输入的方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-11
  • 2019-06-19
  • 2013-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多