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