如何限制C ++中用户输入的字符串和字符?

问题描述 投票:0回答:3

我正在尝试创建一个小型餐厅程序,在该程序中,我将练习到目前为止在C ++中学到的所有内容。但是我跳到一个小问题。在程序开始时,我提示用户是要输入程序,还是通过选择Y或N退出程序。如果输入的内容不是该程序将告诉用户的无效信息。

问题是说用户输入了一个无效字符a。无效的输出将正常显示,并且一切看起来都很完美。但是,如果用户输入两个或更多字符,则无效输出情况将与用户输入的字符一样多地打印。下面的示例:

Output image

#include <iostream>

int main()
{
    char ContinueAnswer;
    std::string Employee {"Lara"};
    std::cout << "\n\t\t\t---------------------------------------"
              << "\n\t\t\t|                                     |"    
              << "\n\t\t\t|            Welcome to OP            |"
              << "\n\t\t\t|Home to the best fast food in Orlando|"
              << "\n\t\t\t|                                     |"
              << "\n\t\t\t--------------------------------------|" << std::endl;

do
{
    std::cout << "\n\t\t\t    Would you like to enter? (Y/N)"
              << "\n\t\t\t                  "; std::cin >> ContinueAnswer;
    if(ContinueAnswer == 'y' || ContinueAnswer == 'Y')
    {
        system("cls");
        std::cout << "\n\t\t\t              My name is " << Employee << "."
                  << "\n\t\t\tI will assist you as we go through the menu." << std::endl;
    }
    else if(ContinueAnswer == 'n' || ContinueAnswer == 'N')
    {
        std::cout << "\t\t\t\tGoodbye and come again!" << std::endl;
        return 0;
    }
    else
        std::cout << "\n\t\t\t\t  Invalid Response" << std::endl;
}
while(ContinueAnswer != 'y' && ContinueAnswer != 'Y')

感谢您抽出宝贵时间阅读本书,并感谢所有回答问题的人:)

c++ c++11 c++14
3个回答
1
投票

您可以简单地使用户输入string

std::string ContinueAnswer;

并像这样比较:

if(ContinueAnswer == "y" || ContinueAnswer == "Y")

将处理多字符输入。

如果还要在输入中处理空格,请更改:

std::cin >> ContinueAnswer;

至:

std::getline(std::cin, ContinueAnswer);

0
投票

在解决您的问题之前,我需要指出,您应该总是在进行任何输入之前先验证输入是否成功。由于inout失败而未设置的处理变量是错误的相当常见的来源。例如:

if (std::cin >> ContinueAnswer) {
    // do something with successfully read data
}
else {
    // deal with the input failing, e.g., bail out
}

我假设如果读取了九个预期字符,则同一行上的所有内容都是无效的。您可以将一行读入std::string。但是,这可能会被滥用以提供非常长的输入行,这最终会导致程序崩溃。同样,将数据读入std::string只是为了扔掉它也是不明智的。我建议忽略直到使用换行符的所有字符(包括换行符)(此方法需要包含<limits>):

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), ‘\n’);

第一个参数是一个特殊值,指示在换行符前可能有任意数量的字符。在实践中,您可以使用类似1000的值,这很好,但是可以使用它。当然,在实际应用中,可以使用专用限制来防止对手使程序长时间忙碌。我倾向于认为我的程序正在受到攻击,以确保我处理异常情况。


0
投票

快速重构会产生此结果:

#include <iostream>
#include <cstring>
#include <stdio.h>

int main()
{
        char ContinueAnswer[256];
        std::string Employee {"Lara"};
        std::cout << "\n\t\t\t---------------------------------------"
              << "\n\t\t\t|                                     |"
              << "\n\t\t\t|            Welcome to OP            |"
              << "\n\t\t\t|Home to the best fast food in Orlando|"
              << "\n\t\t\t|                                     |"
              << "\n\t\t\t--------------------------------------|" << std::endl;

        do
        {
            std::cout << "\n\t\t\t    Would you like to enter? (Y/N)"
                      << "\n\t\t\t                  "; std::cin.getline(ContinueAnswer,sizeof(ContinueAnswer));
            if(strcmp(ContinueAnswer, "Y") == 0 || strcmp(ContinueAnswer, "y") == 0)
            {
                system("cls");
                std::cout << "\n\t\t\t              My name is " << Employee << "."
                          << "\n\t\t\tI will assist you as we go through the menu." << std::endl;
            }
            else if(strcmp(ContinueAnswer, "N") == 0 || strcmp(ContinueAnswer, "n") == 0)
            {
                std::cout << "\t\t\t\tGoodbye and come again!" << std::endl;
                return 0;
            }
            else
                std::cout << "\n\t\t\t\t  Invalid Response" << std::endl; 
        }       
        while(true);
}

cin.getline将获得所有字符,直到定界符为止。然后,您可以使用strcmp检查是否等效,并拒绝您想要的任何东西。最后,似乎您想让它处于无限循环中,所以不必担心最后检查输入然后循环返回。

© www.soinside.com 2019 - 2024. All rights reserved.