Cin在一个循环中

时间:2013-10-10 23:35:59

标签: c++ while-loop cin

所以,我环顾四周,并且在我的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

6 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

作为一个可读性问题,我会在循环中包含你想要的代码。你所拥有的是有效的C ++,因为没有大括号将在下一个语句上循环而整个如果条件是单个语句。现在练习将它们放在单行循环中,你将来会节省一些头痛的调试。

答案 3 :(得分: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结束输入。

答案 4 :(得分: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;

答案 5 :(得分:0)

while (cin >> n) 中,将 While() 视为一个循环以及它括号内的内容。 当 Loop 开始时,您会被移到括号中,并要求 cin 输入一些内容。每次循环开始时都会发生这种情况。在这种情况下没有办法终止循环。这和我想说的一样:

while (/*some condition*/) {
cin >> n; // this is always valid, true
}