while (!correct)
{
cout << "Please enter an angle value => ";
cin >> value; //request user to input a value
if(cin.fail()) // LINE 7
{
cin.clear(); // LINE 9
while(cin.get() != '\n'); // LINE 10
textcolor(WHITE);
cout << "Please enter a valid value. "<< endl;
correct = false;
}
else
{
cin.ignore(); // LINE 18
correct =true;
}
}
嗨,这是我编写的代码的一部分。 此代码的目的是限制用户输入10,10.00等数字, 如果他们输入像(abc,!$ @等等)的值,代码将要求用户重新输入值。
为了执行此功能(限制用户输入有效价值),我会通过论坛获得一些提示和指南。
我认为我有责任学习并理解这些代码的作用......因为这是我第一次使用此代码。 有人可以简单地向我解释代码是什么 第7,9,10和18行呢? 尤其是第10行。我在第10行的其他部分得到了一个简短的想法我不知道它做了什么。
感谢您的导游,我很感激!
答案 0 :(得分:2)
cin.fail()
告诉您先前的输入操作中“某些内容是否失败”。我相信输入流有四种已识别的状态:bad
,good
,eof
和fail
(但fail
和bad
可以是例如,同时设置)。
cin.clear()
将州重置为good
。
while(cin.get() != '\n') ;
将一直读到当前输入行的结尾。
cin.ignore();
将跳到下一个换行符,因此与while(cin.get() != '\n');
非常相似。
如果没有给出正确的输入并且输入“已结束”(例如,CTRL-Z或CTRL-D取决于平台),整个代码也应该检查文件的结尾,否则它将挂起(永远循环失败) 。
答案 1 :(得分:1)
// LINE 7:
cin.fail()检测输入的值是否符合变量中定义的值。
// LINE 18:
cin在流中留下换行符。将cin.ignore()添加到下一行会清除/忽略流中的换行符。
答案 2 :(得分:0)
答案 3 :(得分:0)
第7行:测试输入的数据是否正确(可以读作decltype(value)
)。如果流发生了一些错误,则cin.fail()
始终为true
。后来,在
第9行:您将cin
状态从坏状态清除到之前的正常状态。 (错误后恢复)。在从糟糕状态恢复之前,您无法再读取数据。
第10行:你读到行尾。基本上你从输入中跳过一行
第18行:仅当输入的数据得到纠正时才会执行此行。它从stdin中读取并丢弃一行。
答案 4 :(得分:0)
标准输入流(cin
)可能由于多种原因而失败。
例如,如果value
是int
,则用户输入大量数字
124812471571258125
,cin >> value
将失败,因为该数字太大而无法容纳int
。
有一种更简单的方法可以做你想要的。您希望用户只输入有效的浮点值,例如10或10.00,但没有人物,对吗?所以你可以这样做:
double value;
cout << "Please enter an angle value: " << endl;
while (!(cin >> value)) { //Since value is a double, (cin >> value) will be true only if the user enters a valid value that can be put inside a double
cout << "Please enter a valid value:" << endl;
}
这与您的代码的功能相同,但更简单。
如果您对其他因素导致cin
失败感兴趣,请查看此处:
http://www.cplusplus.com/forum/beginner/2957/
答案 5 :(得分:0)
while(cin.get()!='\ n'):c中的所有字符串都以空值终止。这意味着\ n是所有字符串对象的结尾。假设你有字符串“this”,因为这是\ n,每个字母都存储在char类型中。请继续阅读 http://www.functionx.com/cpp/Lesson16.htm
cin.fail():cin.fail()检测输入的值是否符合变量中定义的值。
读:http://www.cplusplus.com/forum/beginner/2957/
cin.ignore():从输入序列中提取字符并丢弃它们 http://www.cplusplus.com/reference/istream/istream/ignore/
答案 6 :(得分:0)
我知道Stack Overflow中通常只列出链接,所以我会给出更多细节,但这个答案实际上归结为一堆链接。
对于第7行,只需google cin.fail。 Here's一个很好的参考,以及它的内容:
如果为流设置了failbit或badbit错误状态标志中的任何一个(或两者),则返回true。
当在输入操作期间发生除了到达文件结尾之外的某些错误时,至少设置了其中一个标志。
failbit通常由错误与操作本身的内部逻辑相关的操作设置;可以对流进行进一步的操作。虽然badbit通常在错误涉及流的完整性丢失时设置,但即使在流上尝试不同的操作,也可能持续存在。可以通过调用成员函数bad来独立检查badbit: 一行翻译:它会告诉您在尝试读取输入流时是否出现意外错误。
您可以找到cin.ignore,cin.clear和cin.get的类似参考。快速摘要:
cin.ignore - 忽略流中存在的单个字符。
cin.clear - 清除流中的任何错误标记
cin.get - 一次获取一个字符,直到您点击换行符'\n'
。