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

C++ C++;:如果输入不是整数,为什么这段代码会运行一个无止境的循环?,c++,C++,我有一个简单的代码,通过使用引用或指针复制字符串(我是初学者),我想让它确定输入是否为整数,因为如果不是整数,它会出于某种原因不断循环。我试过使用cin.clear(),但似乎不起作用。。 代码如下: #include <iostream> #include <string> #include "test.h" using namespace std; int main() { while (true) { cout << "Type

我有一个简单的代码,通过使用引用或指针复制字符串(我是初学者),我想让它确定输入是否为整数,因为如果不是整数,它会出于某种原因不断循环。我试过使用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;
        }
    }
}
#包括
#包括
#包括“test.h”
使用名称空间std;
int main(){
while(true){
cout>hi;
cout>i;
if(cin.fail())
cin.clear();
开关(一){
案例1:
changestringref(hi);
库特
为什么cin.clear不工作?它不是应该清除上次使用cin时的输入吗?还是我错了

不完全正确。它应该是。
clear()
无参数设置
goodbit
并清除
fail()
状态,但保留任何未处理的输入

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

这一行为在中的描述有些模糊。返回的迭代器(即流)正好指向无法解析的第一个字符之前


<> P> >在代码< > Goto启动之后,再次读取<代码> x>代码>相同的输入,相同的结果,因此循环。

您从不消耗不可解析的输入,因此它被C++代码中的过多解析了。我认为 Goto >在C++中仍然有用。但在这种特殊情况下可能不适用。我从来没有需要使用<代码> Goto <在C或C++代码中,我发现代码变得更难阅读,因此得出结论:<代码> Goto 应该放弃历史,只是为了完成答案——需要调用Cin。buffer@pm100我以为
istream::ignore()
只是跳过下一个(默认值为
n=1
)字符或直到eof?o唯一可以访问内部缓冲区的标准函数是
readsome()
?但在这种情况下,
ignore()
不会起作用。@dhke您可以为其指定除eof之外的分隔符。