c++ - cin input (input is an int) 当我输入一个字母时,它不会打印不正确一次,而是打印正确一次然后在循环的其余部分使用 inc

标签 c++ cin multiplication

我正在制作一个乘法练习程序。正如我的标题所说,如果我在控制台中输入一个字母而不是数字,它会运行时说第一个是正确的,但其余的都是错误的。即使您没有触摸键盘,它仍然会报错。

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 ,您必须验证三个条件:

  1. .eof() ( eofbit ) 已设置。到达输入末尾,或者用户手动生成了一个 EOF通过按 Ctrl+d(或在 windoze 上按 Ctrl+z,但请参阅:CTRL+Z does not generate EOF in Windows 10);

  2. .bad() ( badbit ) 已设置。发生不可恢复的流错误;和

  3. .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

检查一下,如果您还有其他问题,请告诉我。

关于c++ - cin input (input is an int) 当我输入一个字母时,它不会打印不正确一次,而是打印正确一次然后在循环的其余部分使用 inc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50402749/

相关文章:

Mysql - 将两列相乘并减去差值

C 中的字符乘法

c++ - 两个 dynamic_cast 问题

c++ - 如何使类根本不可推导。有什么办法吗?

C++ Cin 输入到数组

C++ 输入运算符重载 ">>"

c++ - 复制 CCSprite

c++ - 如何分辨已提交和保留内存中的内容?

C++ cin 数字忽略第一行?

c++ - 如何找到给定数组中数字之间的最大乘法(限制为 100000 个数字)