int x=0;
string fullname = "";
float salary;
float payincrease;
float newsal;
float monthlysal;
float retroactive;
while(x<3){
cout << "\n What is your full name?";
cin >> fullname;
cout << "\n What is your current salary? \t";
cin >> salary;
cout << "\n What is your pay increase? \t";
cin >> payincrease;
newsal = (salary*payincrease)+salary;
monthlysal = newsal/12.00;
retroactive = (monthlysal*6)-(salary/2);
cout << "\n" << fullname << "'s SALARY INFORMATION";
cout << "\n New Salary \t Monthly Salary \t Retroactive Pay";
cout << "\n \t" << newsal << "\t" << monthlysal << "\t" << retroactive;
x++;
}
我的循环似乎不会在每次询问cin时停止,而是立即执行循环3次。在询问输入时如何让它停止?
答案 0 :(得分:10)
如果在调用cin时输入流不为空,则cin使用缓冲区中已有的数据,而不是等待用户的更多信息。您正在使用提取运算符,因此当cin向您的变量发送值时,它会跳过缓冲区中的前导空格并在下一个空格处停止。
在这一行放置一个断点:
cout << "\n What is your current salary? \t";
运行程序,然后输入Bob Smith。当您点击断点时,将光标悬停在字符串全名上。你会看到它仅存储&#34; Bob&#34;不是&#34; Bob Smith&#34;。 &#34; Bob Smith&#34;放入缓冲区,但是当你使用cin和提取运算符时,它会跳过任何前导空格,将它找到的下一个值放入你的变量中,然后在下一个空格处停止。为了证明这一点,请尝试运行:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str1,str2;
cin >> str1;
cin >> str2;
cout << str1 << " " << str2 << "\n\n";
return 0;
}
如果您输入&#34; Bob Smith&#34;,即使您拨打两次cin,它也只会输入一次。但是,你会发现他们都是&#34; Bob&#34;和#34;史密斯&#34;被捕获在字符串str1和str2中。
因此,您可以得出结论,当cin到达Bob和Smith之间的空间时,cin会停止填充您的字符串fullname。在你下一次打电话给cin时,缓冲区仍然包含&#34; Smith&#34;,所以不是从用户那里获得更多的输入,而是试图用#34; Smith&#34;填充你的变量工资。显然,这并不是你想要的。您可以在每次使用cin之前调用flush并忽略cin来清除缓冲区,或者您可以修复逻辑并使用getline来获取全名,包括空格。
要解决您的问题,您只需使用getline而不是cin&gt;&gt;,请替换此行:
cin >> fullname;
用这个:
getline(cin,fullname,'\n');
其次,您使用while循环执行一组特定次数的操作。这通常是您使用for循环的东西。
另外,您还可以编写微小的输入验证循环,它可以帮助您调试或避免尝试将无效输入放入变量(例如&#34; Smith&#34;放入浮点数)。这样的事情可以奏效:
for(;;)
{
if(cin >> salary)
break;
cin.clear();
cin.ignore(INT_MAX,'\n');
}
请注意,cin返回一个值,因此您可以在if语句中使用它。如果它获得有效输入,它将返回true。如果没有,它将返回false。为了使它更明确,你也可以在没有if语句的情况下使用正常的cin调用,然后检查是否cin.good(),这相当于基本相同的净效果。如果您未使用Visual Studio并收到有关INT_MAX的错误,则可能需要#include limits.h来解决它。
答案 1 :(得分:2)
如果您输入的char
预计会int
,则会出现这种情况。
使用cin.clear();
和cin.ignore(numeric_limits<streamsize>::max(), '\n');
将输入限制为int
。
除此之外,如果输入正确的数据类型,它将不会跳过。
#include <string>
#include <iostream>
#include <limits>
using namespace std ;
int main(void)
{
int x=0;
string fullname = "";
float salary;
float payincrease;
float newsal;
float monthlysal;
float retroactive;
while(x<3)
{
cout << "\n What is your full name?";
cin >> fullname;
cin.ignore( 1000, '\n' );
cout << "\n What is your current salary? \t";
cin >> salary;
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "\n What is your pay increase? \t";
cin >> payincrease;
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
newsal = (salary*payincrease)+salary;
monthlysal = newsal/12.00;
retroactive = (monthlysal*6)-(salary/2);
cout << "\n" << fullname << "'s SALARY INFORMATION";
cout << "\n New Salary \t Monthly Salary \t Retroactive Pay";
cout << "\n \t" << newsal << "\t" << monthlysal << "\t" << retroactive;
x++;
}
cout<<" \nPress any key to continue\n";
cin.ignore();
cin.get();
return 0;
}
答案 2 :(得分:0)
检查你的变量类型,我注意到我的接受一个数字而不是一个字符,有同样的问题(没有停止,循环一直在继续)。
> std::cin >> this->controls.button
> DETOX_NUMBER button; // (int)
更改为:
> char button;