簡體   English   中英

cin和開關奇數行為

[英]cin and switch odd behaviour

所以在使用cinswitch語句時遇到了一些問題。 首先,程序提示輸入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

提前致謝 :

它看起來像功能newCustomers輸入后流浪字符或兩個是越來越掛了choice 這可以解釋為什么ignore調用可以“解決”該問題,這就是@TheBuzzSaw在注釋中建議的解決方案。

為了更清楚地看到這一點,請更改

cout << "test";

cout << "test\n";

或者

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

在某些系統上,控制台是行緩沖的,因此在程序編寫換行符之前,您將看不到任何輸出。 插入endl將刷新輸出緩沖區,因此即使后續代碼掛起,您也應該看到此消息。 或將其更改為:

cerr << "test\n";

cerr在刷新緩沖區方面更具侵略性,這恰恰是因為它用於您不想錯過的錯誤輸出。

簡短答案:我相信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;
}

如果您的cin在循環中使用,我建議使用其他方法。

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

char choice = buffer[0];

switch (choice)
{
    ...
}

您的cin可能沒有被重置,並且任何多余的字符都被饋送到后續的輸入請求中。 獲取更多輸入,僅處理其第一個字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM