在while循环中输入Cin

Posted

技术标签:

【中文标题】在while循环中输入Cin【英文标题】:Cin in a while loop 【发布时间】:2013-10-10 23:35:59 【问题描述】:

所以,我环顾四周,无法弄清楚在我的 While 循环中 cin 发生了什么。我正在阅读 C++ Primer(第 5 版)一书,我注意到在其中一个练习中,如果不终止 while 循环,我就无法使用 cin 来抓取字符串。我只使用 getline() 解决了这个问题。

当前练习的目标是要求用户输入 0 - 15 的值,并将该数字转换为“十六进制等值”(其中 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

【问题讨论】:

the question on while (cin >> ) 的可能重复项 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

作为一个可读性问题,我会在循环中需要的代码周围加上大括号。您所拥有的是有效的 C++,因为没有大括号,while 将在下一条语句上循环,而整个 if 条件是一条语句。即使在单行循环中,现在也可以练习将它们放入其中,这样您以后就可以省去一些令人头疼的调试了。

【讨论】:

【参考方案4】:

有一种更简单的方法:

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 来结束输入。

【讨论】:

看,这让我很困惑。这本书说,用户所要做的就是按 Enter 键。而且我不相信这本书已经过时了(我希望不会)。他们能够按 Enter 并用这段代码结束它而我不能这样做的可能原因是什么?还是可能的原因无穷无尽? @Protomega 这可能是错误的。我没有读过那本书,但我知道如果你执行 while (cin &gt;&gt; i) 循环,你必须按 Ctrl-D (Windows) 或 Ctrl-Z (POSIX) 来结束输入流。【参考方案5】:

CTRL-D 在 Linux 上工作。下面是一个更简单的代码sn-p:

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

【讨论】:

【参考方案6】:

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

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

【讨论】:

以上是关于在while循环中输入Cin的主要内容,如果未能解决你的问题,请参考以下文章

输入在 do-while 循环中无法与 Scanner 类一起使用

python的用户输入和while循环

在 while 循环中消耗文件输入

在一个函数中以两个不同的while循环输入不起作用

利用while循环编程统计输入的一行中字符的个数

在使用读取(bash)的while循环中禁用用户输入