0

所以我在使用cinandswitch语句时遇到了一些问题。首先,程序提示输入int

cout << "How many registers would you like to use?: ";
cin >> kassor;

稍后,要求用户做出选择:

    cout << endl << "Press \"S\" to run the queue simulator and/or make a timestep." << endl;
    cout << "Press \"Q\" to quit." << endl << endl;
    cout << "Choice: ";
    cin >> choice;

    switch (choice)
    {
        case 's':
        case 'S':
        {
            cout << "test";
            nya = newCustomers();
            break;
        }
        case 'q':
        case 'Q':
        {
            return 0;
        }
    }

在这里,'q' 选项可以正常工作,但 's' 选项不能。它“挂起”,好像还在等待输入。我尝试了各种cin.ignore()等等,但无济于事。

令我困惑的是

switch (choice)
{
    case 's':
    case 'S':
    {
        cout << "test";
        nya = newCustomers();
        break;

什么都不提供,但以下内容:

switch (choice)
    {
        case 's':
        case 'S':
        {
            cout << "test";
            cin.ignore(1024, '\n');
            nya = newCustomers();
            break;

输出“测试”。

我的主要问题是:是问题cin还是在case: s

提前致谢 :

4

3 回答 3

1

看起来该函数newCustomers在输入choice. 这可以解释为什么ignore调用“修复”了问题,这是@TheBuzzSaw 在评论中建议的解决方案。

为了更清楚地看到这一点,请更改

cout << "test";

cout << "test\n";

或者

cout << "test" << std::endl;

在某些系统上,控制台是行缓冲的,因此在程序写入换行符之前您不会看到任何输出。插入endl会刷新输出缓冲区,因此即使后续代码挂起,您也应该看到该消息。或将其更改为:

cerr << "test\n";

cerr更积极地刷新缓冲区,正是因为它用于您不想错过的错误输出。

于 2012-08-23T15:27:00.780 回答
0

简短的回答: 我相信 cin 在某处失败,或者它是意外行为的原因,如果没有更多代码,我无法查明它。

编辑:我不能对你的帖子发表评论,所以我想我会在这里发帖。“挂起”可能是一个无限循环。如果您正在做类似我正在做的事情并循环获取输入并且无法清除错误位 cin 将不断失败。如果您每次请求输入时都没有计算某些内容,那么它可能只是静静地坐在那里循环通过输入收集功能。在所有循环中放置断点,并使用调试器单步执行以验证您的循环都不是无限循环。

尝试添加 std::cin.clear(); 在第二个测试用例中的 .ignore() 之前。看看这是否会停止你的悬挂。

解释:

cin 可能会失败。这可能会导致奇怪的行为。它失败的一种常见方法是,如果您正在读入一个整数并且您获得了字符输入。一旦 cin 失败,它就会设置一个失败位,从那时起,cin 的行为就不会像你期望的那样。

我建议不要使用裸露的 cin >> 选项,因为它可能会失败并且您不会知道。我会将其抽象为一种可以获取所需正确输入的方法。

我个人保留了一个小型实用程序库 (.h) 和 .cpp,以包含在我使用我已经编码的常见功能的项目中。

我有一个 readIntBetween() 函数,它接受 2 个整数并从标准输入中读取这两个数字之间的整数。如果用户没有提供正确的输入(整数上下界,或包含字符的输入),我会要求他们重新输入。

在这个函数中,我确保在检测到故障时清除故障位,并且我忽略了诸如 200 个字符之类的内容以“刷新”它。

这是我的 readIntBetween 函数的代码。我希望它可以帮助您诊断错误并修复它:

int readIntBetween(int lower, int upper, std::string prompt)
{
    bool goodVal = false;
    int value = -1;
    do
    {
        std::cout << prompt ;
        std::cin >> value;

        if ( value >= lower && value <= upper)//check to make sure the value is in between upper and lower
            goodVal = true;
        else
        {
            if(std::cin.fail())
            {
                std::cout << "\tError - invalid format for integer number" << std::endl;

                //clear all status bit including fail bit
                std::cin.clear();

                //flush input buffer to discard invalid input
                std::cin.ignore(1000, '\n');

            }
            else
            std::cout << "Value is not valid, must be between " << lower<<" and "<<upper<<"."<<std::endl;
        }



    }while(!goodVal);
    return value;
}
于 2012-08-23T15:28:40.670 回答
0

如果您cin在循环中使用,我建议使用不同的方法。

char buffer[64];
cin.getline(buffer, 64);

char choice = buffer[0];

switch (choice)
{
    ...
}

您可能cin没有被重置,并且任何无关的字符都被输入到后续的输入请求中。获取更多输入并仅处理其第一个字符。

于 2012-08-23T15:38:20.927 回答