istream 循环使程序跳过 CIN 语句

istream loop makes the program jump over cin statement

提问人:Hzine 提问时间:2/11/2021 最后编辑:Remy LebeauHzine 更新时间:2/11/2021 访问量:125

问:

这是一个程序,它采用一系列空格分隔的数字,然后存储在一个向量中。问题是当将循环放在 的输入之前时,程序会跳转下一个语句,但相反的情况非常正常。cinx0cin

你能向我解释一下我在这里错过了什么吗?

跳跃状态:

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;
    }
}
C++ +11 用户输入 IOSTREAM CIN

评论

0赞 πάντα ῥεῖ 2/11/2021
如果输入一个字符,你希望看到什么?? 不太可能成为现实。另外,我想在这种情况下总是会回来的。tempif (!isalpha(temp))cin>>tempfalse
0赞 Hzine 2/11/2021
temp 是一个临时的 int 变量,用于帮助推回 V 中的序列,它可以用作 for(int temp; cin>>temp;)
1赞 πάντα ῥεῖ 2/11/2021
我已经看到了。问题是,但是您检查是否已输入a。你想要的是:stackoverflow.com/questions/24504582/......tempintchar
0赞 Hzine 2/11/2021
这里的问题是第二个 CIN>>x0 不起作用,如果我先放循环,它根本不会被评估,相反,如果我先放 cin>>x0,一切都正常,所以问题是关于 CIN>>x0
3赞 πάντα ῥεῖ 2/11/2021
@Hzine 掌握代码实际执行操作的最佳方法是使用调试器逐行执行,并在每个步骤中检查变量的内容。

答:

2赞 Remy Lebeau 2/11/2021 #1

在第一个示例中,您将在循环中调用,直到读取失败,这可能是因为输入了非整数,或者用户显式结束了输入(使用或您的平台使用的任何内容)。然后您尝试在不首先清除 的错误状态的情况下调用,因此读取也会失败。cin >> tempCtrl-CCtrl-Zcin >> x0cin

您的调用(不会丢弃输入缓冲区中的数据,只会重置 的错误状态)需要在失败后完成,而不是在检查后完成,例如:cin.clear()cincinoperator>>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 >> x0cin >> x0cin >> 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>>tempEignore()Eisalpha()isalpha()tempintcharcharintisalpha()
0赞 Hzine 2/14/2021
神秘的是,我的 VS C++ 遇到了更多问题,所以我修复了我的 VS2019 安装,将项目标准设置为 C++17,代码运行良好,我仍然不知道是问题所在,但我确认您的代码正在工作,而我的原始代码没有。