C++:如果输入不是整数,为什么这段代码会运行一个无休止的循环

C++: Why does this code run an endless loop if the input was not integral?

本文关键字:运行 一个 循环 无休止 代码 整数 输入 为什么 C++ 段代码 如果      更新时间:2023-10-16

我有一个简单的代码,可以通过使用引用或指针来复制字符串(我是初学者),我想让它确定输入是否是整数,因为如果不是,它会因为某种原因而保持循环。我试过使用cin.clear(),但似乎不起作用。。这是代码:

#include <iostream>
#include <string>
#include "test.h"
using namespace std;
int main() {
    while (true) {
        cout << "Type something: ";
        string hi;
        cin >> hi;
        cout << "Choose a method to change it:n1. By reference.n2. By using pointers.n";
    start:
        int i;
        cin >> i;
        if (cin.fail())
            cin.clear();
        switch (i) {
        case 1:
            changestringref(hi);
            cout << hi << 'n';
            break;
        case 2:
            changestringptr(&hi);
            cout << hi << 'n';
            break;
        default:
            cout << "Choose by typing either 1 or 2: ";
            goto start;
            break;
        }
    }
}

每当我键入一个字符串(在第二次输入时),它都会循环这句话:"通过键入1或2选择:通过键入1和2选择:"等等。我该如何解决这个问题?为什么cin.clear不起作用?它不是应该清除上次使用cin时的输入吗?还是我错了?O.O

提前感谢:D

为什么cin.clear不起作用?它不是应该清除上次使用cin时的输入吗?还是我错了?

不完全是。它应该为流的内部错误状态标志设置一个新值。不带参数的clear()设置goodbit并清除fail()状态,但保留任何未处理的输入

假设您输入了'x'。由于'x'不是数字,cin >> i设置failbit不消耗输入(实际上,它将已经消耗的x推回输入缓冲区,但那是另一回事)。

这是num_get::get()中有些模糊的行为记录。返回的迭代器(即流)正好指向无法解析的第一个字符之前。

所以下一次,在goto start;之后,您将再次读取x。相同的输入,相同的结果,因此是无休止的循环。