cin不接受C ++中的用户输入

时间:2017-07-29 19:21:25

标签: c++

我是编程的初学者,我正在尝试制作一个程序来计算你一生中接触过多少辐射。出于某种原因,我的xray函数中的'cin'不接受用户输入,只是以代码0退出。

#include <iostream>
#include <conio.h>
#include <windows.h>
#include <stdlib.h>
#include <string>
#include <sstream>
using namespace std;
bool nearpowerplant;
int XRay; // the amount of times you got an x-ray
double tRads = 0; // your total dose of radiation in your lifetime, measured in mSv (millisievert)
int age;

//the sleep function
void sleep() {
    Sleep(1000); // 1000 miliseconds = 1 second
}
/*
 >system("CLS")< for clear the console
 */

//introduction and pretty much the menu
void intro() {

    cout << "Welcome to the Radiation Level Calculator" << endl;
    sleep();
    cout << "Conceptualized and created by Anatoly Zavyalov" << endl;
    sleep();
    cout << "Press the ENTER key to begin." << endl;
    cin.get();

}
//introduction to general questions
void genintro() {

    // intro to the medical
    system("CLS");
    sleep();
    cout << "Let's begin with general questions." << endl;
    sleep();
    cout << "Press the ENTER key to continue." << endl;
    cin.get();

}

//medical questions
void Age() {

    //age
    system("CLS");
    cout << "How old are you?\n" << endl;
    sleep();
    cin >> age;

    if (age <= 0) {
        cout << "Your age can't be less or equal to 0." << endl;
        Age();
    }

    else {
        tRads += (age * 2);
        sleep();
        cout << tRads << endl;
    }

}

//live close to powerplant?
void powerplant() {
    system("CLS");
    cout << "Do you live within 75 kilometers of a nuclear powerplant?" << endl;
    sleep();
    cout << "If yes, type YES. If no, type NO." << endl;
    cin >> nearpowerplant;

    if (nearpowerplant = "YES") {
        tRads += (age * 0.01);
    }
    else {}

    sleep();
    cout << tRads << endl;
}


void xray() {
    system("CLS");
    cout << "How many times have you had an x-ray?\n" << endl;
    sleep();
    cin >> XRay;
    if (XRay < 0) {
        cout << "You can't have an x-ray a negative amount of times." << endl;
    }
    else {
        tRads += (XRay * 3.1);
    }
    sleep();
    cout << tRads << endl;
}





//main function, put all of the loops into here
int main() {

    intro(); // the introduction

    genintro(); // medical intro

    Age(); // asks for age

    powerplant(); // asks if lives close to powerplant

    xray(); // asks for x-ray

    return 0;
}
编辑:我编辑了帖子以包含整个代码。顺便说一下,我正在使用2017年的Visual Studio社区。

2 个答案:

答案 0 :(得分:0)

bool nearpowerplant;

nearpowerplant是一个布尔。这是真是假。这就对了。值得注意的是,没有理由将此变量全局访问并为整个程序运行消耗存储空间。它在程序中使用了两次,两次都在同一个函数中。它应该是由使用它的函数确定的自动变量。

cout << "If yes, type YES. If no, type NO." << endl;
cin >> nearpowerplant;

将“YES”或“NO”读入bool类型的变量失败。 cin无法将字符串输入转换为布尔值,cin将停止接受输入,直到错误被清除。删除导致cin失败或猜测什么的垃圾输入也是个好主意? cin只会再次失败。有关如何处理此问题的数百个问题,因此我只想在此处删除关键字:clearignore

Takeaways:确保数据条目与输入的数据类型相匹配,并在每次读取后测试流以确保读取成功。

例如:

if (cin >> nearpowerplant)
{
    // do stuff
}
else
{
    // clean up
}

这解决了OP的可见错误,但由于它与它们可能发现的下一个错误密切相关,我们也可以覆盖它。

if (nearpowerplant = "YES") {
    tRads += (age * 0.01);
}
else {}

if (nearpowerplant = "YES") {使用=(赋值),它应该使用==(比较)。 C ++在这里是不可原谅的,因为这将编译。它真正做的是获取字符串文字的地址“YES”,测试它不是null,并将nearpowerplant设置为结果。由于字符串文字的地址永远不会为NULL,因此结果始终为true,当if测试结果时,if将始终输入。

例如:http://ideone.com/4QL2jn

所以我们需要的更像是

cout << "If yes, type YES. If no, type NO." << endl;
string temp;
cin >> temp;
if (temp == "YES") {
    tRads += (age * 0.01);
}
else {}

注意如果用户输入“是”,“是”,“是”或除了“是”以外的任何内容,则会跳过此步骤。您如何处理此问题取决于您,但std::tolowerstd::transform可能会有所帮助。

答案 1 :(得分:-1)

我认为sleep()有未定义的行为,你应该在没有测试的情况下,os处理用户输入而你不必关心用户输入。endl刷新cout,所以文本是直接显示。

编辑:

也许系统(“CLS”)或睡眠会产生无声错误。