提问人:Hzine 提问时间:2/11/2021 最后编辑:Remy LebeauHzine 更新时间:2/11/2021 访问量:125
istream 循环使程序跳过 CIN 语句
istream loop makes the program jump over cin statement
问:
这是一个程序,它采用一系列空格分隔的数字,然后存储在一个向量中。问题是当将循环放在 的输入之前时,程序会跳转下一个语句,但相反的情况非常正常。cin
x0
cin
你能向我解释一下我在这里错过了什么吗?
跳跃状态:
vector<int> V{};
int x0{}, temp{};
cout << "Enter sequence\n";
for(temp;cin>>temp;)
{
if (!isalpha(temp)) V.push_back(temp);
else
{
cin.clear();
break;
}
}
cout<<"enter x0 : ";
cin >> x0;// the program skips this!
工作反面:
vector<int> V{};
int x0{}, temp{};
cout<<"enter x0 : ";
cin >> x0;
cout << "Enter sequence\n";
for(temp;cin>>temp;)
{
if (!isalpha(temp)) V.push_back(temp);
else
{
cin.clear();
break;
}
}
答:
2赞
Remy Lebeau
2/11/2021
#1
在第一个示例中,您将在循环中调用,直到读取失败,这可能是因为输入了非整数,或者用户显式结束了输入(使用或您的平台使用的任何内容)。然后您尝试在不首先清除 的错误状态的情况下调用,因此读取也会失败。cin >> temp
Ctrl-CCtrl-Zcin >> x0
cin
您的调用(不会丢弃输入缓冲区中的数据,只会重置 的错误状态)需要在失败后完成,而不是在检查后完成,例如:cin.clear()
cin
cin
operator>>
isalpha()
vector<int> V;
int x0, temp;
cout << "Enter sequence\n";
do
{
if (!(cin >> temp))
{
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
break;
}
if (isalpha(temp))
break;
V.push_back(temp);
}
while (true);
cout << "enter x0 : ";
cin >> x0;
在第二个示例中,您不会尝试在读取失败后调用,这就是该代码工作的原因(前提是用户实际输入了有效的整数 ,否则将立即失败,因为您没有重置错误状态或从缓冲区中丢弃数据)。cin >> x0
cin >> x0
cin >> temp
评论
0赞
Hzine
2/12/2021
很抱歉,即使我复制了您的代码,它仍然是同样的问题,我知道问题可能存在于 istream 状态,但为什么它没有再次重置,我正在使用 Visual Studio 2019
0赞
Remy Lebeau
2/12/2021
@Hzine你使用什么样的输入来测试?你用什么条件来打破这个循环?
0赞
Hzine
2/13/2021
像 1 2 3 1 2 3 1 2 3 E 这样的序列,用于检测从元素 x0 开始的序列中的重复,我使用的是弗洛伊德算法。数据是空格分隔的,E 定义序列的结束。
1赞
Remy Lebeau
2/14/2021
@Hzine,那么检查是无用的,因为它永远不会返回 true。当达到时,将失败,并且将吞噬.您只将字母(65-90 和 97-122)的 ASCII 范围内的个位数传递给该数字。如果要进行检查,则应从 更改为 ,但是在推入向量时必须将 from to 平移。只是摆脱,它对你没有帮助。isalpha()
cin>>temp
E
ignore()
E
isalpha()
isalpha()
temp
int
char
char
int
isalpha()
0赞
Hzine
2/14/2021
神秘的是,我的 VS C++ 遇到了更多问题,所以我修复了我的 VS2019 安装,将项目标准设置为 C++17,代码运行良好,我仍然不知道是问题所在,但我确认您的代码正在工作,而我的原始代码没有。
评论
temp
if (!isalpha(temp))
cin>>temp
false
temp
int
char