程序不等待cin

use*_*490 7 c++ console loops input

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++;
}
Run Code Online (Sandbox Code Playgroud)

每次询问cin时,我的循环似乎都没有停止,而是立即执行循环3次.当询问输入时,如何让它停止?

der*_*ace 11

如果在调用cin时输入流不为空,则cin使用缓冲区中已有的数据,而不是等待用户的更多信息.您正在使用提取运算符,因此当cin向您的变量发送值时,它会跳过缓冲区中的前导空格并在下一个空格处停止.

在这一行上设一个断点:

cout << "\n What is your current salary? \t";
Run Code Online (Sandbox Code Playgroud)

运行程序,然后输入Bob Smith.当您点击断点时,将光标悬停在字符串全名上.你会看到它只存储"Bob"而不是"Bob Smith"."Bob Smith"被放入缓冲区,但是当你使用cin和提取运算符时,它会跳过任何前导空格,将它找到的下一个值放入变量中,然后在下一个空格处停止.为了证明这一点,请尝试运行:

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string str1,str2;
    cin >> str1;
    cin >> str2;
    cout << str1 << " " << str2 << "\n\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果您输入"Bob Smith",即使您拨打两次cin,它也只会输入一次.但是,您会看到"Bob"和"Smith"都在字符串str1和str2中被捕获.

因此,您可以得出结论,当cin到达Bob和Smith之间的空间时,cin会停止填充您的字符串fullname.在您下次调用cin时,缓冲区仍包含"Smith",因此不会从用户那里获取更多输入,而是尝试用"Smith"填充您的变量工资.显然这不是你想要的.您可以在每次使用cin之前调用flush并忽略cin来清除缓冲区,或者您可以修复逻辑并使用getline来获取全名,包括空格.

要解决您的问题,您需要做的就是使用getline而不是cin >>,所以替换这一行:

cin >> fullname;
Run Code Online (Sandbox Code Playgroud)

有了这个:

getline(cin,fullname,'\n');
Run Code Online (Sandbox Code Playgroud)

其次,您使用while循环执行特定次数的一组操作.这通常是你使用for循环的东西.

顺便说一下,您还可以编写微小的输入验证循环,它可以帮助您调试或避免尝试将无效输入放入变量(例如"Smith"到浮点数中).像这样的东西可以工作:

for(;;)
{
    if(cin >> salary)
        break;
    cin.clear();
    cin.ignore(INT_MAX,'\n');
}
Run Code Online (Sandbox Code Playgroud)

请注意,cin返回一个值,因此您可以在if语句中使用它.如果它获得有效输入,它将返回true.如果没有,它将返回false.为了使它更明确,你也可以在没有if语句的情况下使用正常的cin调用,然后检查是否cin.good(),这相当于基本相同的净效果.如果您没有使用Visual Studio并获得有关INT_MAX的错误,则可能需要#include limits.h来解决它.


Sof*_*ner 5

如果您输入 a charwhere an ,则会发生这种情况int

使用 cin.clear();cin.ignore(numeric_limits<streamsize>::max(), '\n');将输入限制为int仅 's。

除此之外,如果输入了正确的数据类型,它将不会跳过。

#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;
}
Run Code Online (Sandbox Code Playgroud)