当我输入一个字母时,cin 输入(输入是一个 int),而不是打印错误一次,它打印正确一次,然后在循环的其余部分打印 i
cin input (input is an int) when I input a letter, instead of printing back incorrect once, it prints correct once then inc for the rest of the loop
我正在制作一个乘法练习程序。正如我的标题所说,如果我在控制台中输入一个字母而不是一个数字,它会在第一个字母上说正确,但在其余部分不正确。即使您没有触摸键盘,它仍然会吐出不正确的信息。
ans = table * i;
std::cout << table << " * " << i << " =" << std::endl;
std::cin >> input;
if(input == ans)
{
std::cout << "Correct! " << ans << std::endl;
}
else
{
std::cout << "Incorrect, the answer was " << ans << std::endl;
input = 0;
ans = 0;
}
}
希望这能让您了解代码中发生的情况。这是输出。
Enter the table you'd like to learn.
5
Enter the amount of multiples
3
5 * 0 =
s
Correct! 0
5 * 1 =
Incorrect, the answer was 5
5 * 2 =
Incorrect, the answer was 10
5 * 3 =
Incorrect, the answer was 15
我该怎么做才能解决这个问题?感谢您的输入。
有许多方法可以构建各种测试,但是当使用cin
(或通常使用任何输入函数(进行输入时,必须考虑输入缓冲区中未读取的任何字符。对于cin
,您必须验证三个条件:
.eof()
(eofbit
( 已设置。要么到达输入结束,要么用户通过按 Ctrl+d手动生成EOF
(或在 windoze 上按 Ctrl+z,但请参阅:CTRL+Z 在 Windows 10 中不会生成 EOF(;.bad()
(badbit
( 已设置。发生不可恢复的流错误;和.fail()
(failbit
( 已设置。发生匹配或其他可恢复故障。发生故障时,输入停止,并且不会从输入缓冲区中提取更多字符。
(您可以将 1 和 2 合并为一个测试,因为此时输入已结束(
对于failbit
,您必须做两件事。(1( 必须通过调用cin.clear()
来清除流错误状态,以及 (2( 必须处理输入缓冲区中未读取的任何字符。通常,这是通过包含<limits>
和调用来处理的:
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
(这将从输入缓冲区中清除最多INT_MAX
个字符,在遇到分隔符(此处'n'
(时停止(
在用户输入有效整数之前循环的简短示例可能是:
#include <iostream>
#include <limits>
using namespace std;
int main (void) {
int x = 0;
while (1) /* loop continually until valid input received */
{
cout << "nenter an integer: ";
if (! (cin >> x) ) { /* check stream state */
/* if eof() or bad() break read loop */
if (cin.eof() || cin.bad()) {
cerr << "(user canceled or unreconverable error)n";
return 1;
}
else if (cin.fail()) { /* if failbit */
cerr << "error: invalid input.n";
cin.clear(); /* clear failbit */
/* extract any characters that remain unread */
cin.ignore(numeric_limits<streamsize>::max(), 'n');
}
}
else { /* on succesful read of int */
/* extract any characters that remain unread */
cin.ignore(numeric_limits<streamsize>::max(), 'n');
break; /* then break read loop */
}
}
cout << "integer: " << x << 'n';
}
(如开头所述,只要涵盖所有三个条件,您就可以以多种不同的方式构建测试。
此外,您可以通过调用rdstate()
来显式检查流位,而不是使用.fail()
等进行测试,例如
if (std::cin.rdstate() == std::ios_base::failbit)
示例使用/输出
$ ./bin/cin_validate_int
enter an integer: no
error: invalid input.
enter an integer: "an integer"
error: invalid input.
enter an integer: abc 123
error: invalid input.
enter an integer: 123
integer: 123
仔细查看,如果您有其他问题,请告诉我。
当你执行cin >> input
并且它无法将输入解析为数字时,它会设置cin
的failbit
,当设置failbit
时,它实际上不会读取更多的数据,直到你清除它。
您应该通过调用cin.good()
来检查错误,并尝试使用cin.clear()
清除它们,但您不应该尝试清除某些错误(如 EOF(,而应该退出它们。
- 打印时有二叉树问题.用户输入不打印任何内容
- 为什么有时我输入一个整数,程序将第一个输入的数字打印成十进制数?
- 我要求用户输入大小和数组,但是当我打印矢量时,它仅显示'0'作为输出
- 如何打印不带空格的输入整数?
- 为什么无论输入如何,所有 if-else 语句都会打印?
- 使用用户输入打印 6X10 矩阵的代码 - C++
- 如何使用打印到 PDF 打印机在 MFC 和 CView 中以编程方式打印而不提示输入文件名?
- :CIN 不断打印用户在每次循环后输入的内容
- 读取一组用户输入,按升序排序,然后打印结果
- 从用户那里获得无限量的输入,而不是打印最大的3个,而不使用数组
- 为什么这个程序接受整数和字母数字输入并打印它们? C++ 中的 std::string 也采用整数值吗?
- 使用 getline 从输入文件打印时如何忽略空白行
- 如何打印输入值
- 如何在没有打印语句的情况下报告用户输入错误
- 当我们声明 cin 为 int 并从 cin 中获取输入并在 cout 中打印 cin 时会发生什么?
- 如何通过输入十进制数打印UTF-8符号?
- 为什么如果我从键盘输入EOF克里昂不要在运行窗口打印程序的输出?
- CLion 会自动从标准输入打印回输入,是否有任何解决方法
- 程序中模板类型的输入打印错误
- 下面的代码应该为4和0的输入打印120.000000。但它只显示 120。为什么?以及如何获得所需的输出?