Switch陈述式在C++中只接受int输入[duplicate]

mrphzbgm  于 2022-12-01  发布在  其他
关注(0)|答案(2)|浏览(137)

此问题在此处已有答案

Infinite loop with cin when typing string while a number is expected(4个答案)
2天前关闭。
试图创建一个菜单,但使其只接受整数来选择选项,并在用户输入字母时返回。
AppUI.cpp

#include <iostream>
#include <windows.h>
#include <iomanip>
#include <string>
#include <cstring>
#include <algorithm>
#include <unistd.h>
#include <stdio.h>

using namespace std;

void AppUI::SearchBook()
{
    system("CLS");
    TitleHeader();
    setTxtColor(10);
    PageTitle("Search Book");

    cout << "Search books by:" << endl;
    cout << "1. Title" << endl;
    cout << "2. Author" << endl;
    cout << "3. Publication Date" << endl;
    cout << "4. Publisher" << endl;
    cout << "\n0. Go back to main menu" << endl;
}

EditBook.cpp

#include <iostream>
#include <windows.h>
#include <iomanip>
#include <string>
#include <cstring>
#include <algorithm>
#include <unistd.h>
#include <stdio.h>

using namespace std;

void EditBook::SearchBook()
{
    //variable declarations
    int Opt;
    char searchTxt[255];

    SearchStart:
    UI.SearchBook();
    cout << "\nOption: ";
    cin >> Opt;

    switch(Opt)
    {
        case 0:
            UI.MainMenu();
            break;

        case 1:
            system("CLS");
            cout << "Enter title: ";
            cin.getline(searchTxt,sizeof(searchTxt));
            SearchByTitle(searchTxt);
            break;

        case 2:
            system("CLS");
            cout << "Enter author name: ";
            cin.getline(searchTxt,sizeof(searchTxt));
            SearchByAuthor(searchTxt);
            break;

        case 3:
            system("CLS");
            cout << "Enter publication date: ";
            cin.getline(searchTxt,sizeof(searchTxt));
            SearchByPubDate(searchTxt);
            break;

        case 4:
            system("CLS");
            cout << "Enter publisher: ";
            cin.getline(searchTxt,sizeof(searchTxt));
            SearchByPublisher(searchTxt);
            break;

        default:
            cout << "Invalid option!";
            sleep(1);
            goto SearchStart;
            break;
    }
}

在搜索书中,当我输入一个选项中没有的数字,比如“5”,它会循环回来,让我输入正确的选项。但是当我输入一个字母,比如“a”,它会循环回来,让它一遍又一遍地显示“无效选项”,不让我输入新的选项。我希望当我输入一个字母,这是一个无效选项,它仍然会返回并让我输入正确的一个,这是一个数字/整数。

t5fffqht

t5fffqht1#

您希望“当用户输入字母时循环返回”。
因此,您希望允许用户输入字母,以便检测并对其做出React。为此,您需要接受多于int的输入;而int Opt;cin >> Opt;则没有。
您需要既可以是整数又可以是字符的对象。
例如,字符串。然后解释它,并仅在它可以用作整数时用作整数。

neskvpey

neskvpey2#

按照现有的代码,你需要

if (!(cin >> Opt))
{
    cin.clear();            // clear stream error state
    cin.ignore(100, '\n');  // ignore any pending input
    goto SearchStart;       // loop back
}

当然我不能推荐使用goto,写一个合适的循环。
我不想敲我自己的答案,但最好的解决方案是Yunnosch的,但也许这是一个有点困难的代码为初学者。

相关问题