首页 文章

Cin在一个循环中

提问于
浏览
1

所以,我环顾四周,并且在我的While循环期间无法弄清楚cin发生了什么 . 我正在阅读C Primer(第5版)这本书,我注意到在其中一个练习中我不能使用cin来抓取字符串而不会终止while循环 . 我通过使用getline()解决了这个问题 .

当前练习的目标是从0到15的值请求用户输入,并将该数字转换为它的“Hex Equivelant”(其中0 = 1,1 = 2,2 = 3,...,10 = A,11 = B) . 我试着在没有这本书的情况下做到这一点并且失败了,但后来又开始质疑书中的代码 . 这是本书中的代码:

//Note: <iostream> and <string> have been included. using namespace std is used 
const string hexdigits = "0123456789ABCDEF";
cout << "Enter a series of numbers between 0 and 15"
     << " separated by spaces. Hit ENTER when finished: "
     << endl;
string result;
string::size_type n;

while(cin >> n)
    if (n < hexdigits.size())
        result += hexdigits[n];
cout << "Your hex number is: " << result << endl;

如果我要运行这个代码,它会永远不会在输入任何代码之后终止while循环(基本上给出了我想的空白输入?) .

我有两个原因:

1)为什么这段代码不起作用? 2)我希望在正确的方向上轻推,但不是如何让这个代码正确执行的答案

如果我不能在不妥协理由2的情况下收到理由1,我宁愿让理由1得到满足 .

快速编辑:我很抱歉,我正在使用Visual Studio 2012

5 回答

  • 3

    按Enter键可生成CR或LF或两者,具体取决于您的平台 . 这是一个有效的输入,因此满足继续while循环的条件 . 您需要在输入开头显式测试这些字符,或使用Ctrl-C来突破循环 .

    作为一个可读性问题,我会在循环中包含你想要的代码 . 你有什么是有效的C,因为没有大括号,while将在下一个语句循环,整个if条件是单个语句 . 现在练习将它们放在单行循环中,你将来会省去一些头疼的调试 .

  • 0

    只要您输入有效数字,它将继续读取数字 . 您可以通过输入不是数字的内容来终止循环,例如“再见” . 在一行的开头,即在击中后立即进入你也应该能够使用Ctrl-Z终止标准输入(我认为;我通常在类UNIX系统上工作,你可以使用Ctrl-终止标准输入d) .

    基本上,只要 std::ios_base::failbitstd::ios_base::badbit 都没有设置为其状态,流就会转换为 true (您可以使用 stream.rdstate() 查看 stream 的状态) . 只要您成功从流中读取整数,就没有理由进入失败状态 . 当您输入不是整数的东西时,它将被设置为 std::ios_base::failbit . 同样,当它到达流的末尾时 .

  • 1

    @Protomega,您可以使用相同的代码,但按Ctrl D可停止输入流 .

  • 0

    有一种更简单的方法可以做到这一点:

    const string hexdigits = "0123456789ABCDEF";
    cout << "Enter a series of numbers between 0 and 15 separated by spaces. Hit ENTER when finished: " << endl;
    string line;
    string result;
    if (getline(cin, line)) // get the whole line
    {
        istringstream iss(result); // break them by spaces
        int i;
        while (iss >> i)
        {
            result += hexdigits[i];
            result += " ";
        }
        cout << "Your hex result:  " << result << endl;
    }
    else
    {
        cout << "Error handling input!" << endl;
    }
    

    使用您的解决方案,您需要按Ctrl-D结束输入 .

  • 0

    CTRL-D适用于Linux . 下面是一个更简单的代码片段:

    vector<double> vd;
    for (double d; cin>> d;)
         vd.push_back(d);
    for(int i=0; i<vd.size(); ++i)
       cout << vd[i] << endl;
    

相关问题