当前位置: 首页 > 知识库问答 >
问题:

Try and catch with while loop:仅当第一个输入不正确时,即使在输入正确后也会跳转到catch块-C

孔乐邦
2023-03-14

我试图检查用户是否输入了他们的名字,有或没有空格,即乔·布洛格斯。他们的名字中不能有特殊的字符或数字,否则会弹出一条错误信息,即Jo3_Bl0ggs。我想做的是,如果他们以错误的格式输入他们的名字,一条错误信息将被提醒,程序将要求用户再次输入他们的名字,直到他们输入正确。

我使用的是当循环这样做,如果它是正确的,我改变了标志的值,并打破了循环,如果不是,我会重新运行setName()函数,要求他们的名字。

然而,我遇到的问题是,如果他们第一次输入不正确,它会要求他们再次输入自己的名字,如果第二次输入正确,则会显示一条消息“Welcome Joe Bloggs”,但循环将继续,并要求他们再次输入自己的名字。

我能避免这个问题的唯一方法是,如果第一个输入是正确的,但这样做会破坏try-and-catch块的整个要点。

下面是我关心的两个函数。如果有人能给我指出正确的方向,那就太好了。我是c语言的新手,这就是为什么我对此有点困惑的原因。

inputclass::inputclass(){//empty constructor}

void inputclass::validateName(string name){
    int flag = 1;
    while ( flag == 1){
        try{

            for (int i=0;  i < name.length(); i++){

                if (name[i] != ' '){

                    if (!isalpha(name[i])){

                        cout << "You have entered incorrectly. Please try again. "  << endl;
                        cin.clear();   //I'm trying to clear input buffer but still doesn't work
                        cin.ignore(256, '\n');
                        setName();
                        throw 0;  //do i need this?

                        break; //do i need breaks?

                    }else if(i == name.length()-1){

                        cout << "Welcome to the program " << name << endl;
                        flag = 2;   //break out of while loop
                        break;  //not sure if this does anything
                    }
                }
            }
        }catch (int e){
            cout << "There's been an error" << endl;
            setName();   //until input is correct, this will ask the user for their name.
        }
    }
}
void inputclass::setName(){

    string name;
    cout << "Please enter your name: " << endl;
    getline(cin, name);
    validateName(name);


}

共有1个答案

沈冠宇
2023-03-14

我诚实地认为你的算法逻辑本身是错误的。验证应该作为输入的结果来完成。输入本身应该是验证失败时回收的决策点

1、编写一个简单的验证函数

这比你想象的要容易,尤其是因为标准库提供了一些简洁的算法来为你做很多迭代工作。

2.在setName()中专门集成验证功能;而不是相反。

你的输入机制应该接受所说的输入,验证,如果无效,循环输入。验证器应该只返回yes或nay。将输入机制留给输入函数,不要从验证器触发它们。验证器就是为了这个;验证,而不是循环输入循环。

第一个非常简单,因为标准库为您提供了所需的大多数算法。下面的示例使用了一个函子来实现这一点,但C 11可以用lambda轻松实现这一点:

struct is_not_space_or_alpha
{
    bool operator()(char c) const
    {
        return c != ' ' && !std::isalpha(static_cast<unsigned char>(c));
    }
};

static bool is_valid_name(const std::string& name)
{
    return !name.empty() &&
        name.end() != std::find_if(name.begin(), name.end(), is_not_space_or_alpha());
}

这样一来,你的setName()就成为了验证输入结果的位置;验证不会在内部触发更多输入。这由调用方(setName())决定:

std::string name;
while (true)
{
    std::cout << "Please enter your name: ";
    std::flush(std::cout);

    if (std::getline(std::cin, name) && is_valid_name(name))
    {
        std::cout << "Welcome to the program " << name << "!\n";
        break;
    }

    std::cout << "You have entered incorrectly. Please try again. \n";
    std::cin.clear();
}

样本输出

Please enter your name: Monkey777
You have entered incorrectly. Please try again. 
Please enter your name: Wiley Coyote
Welcome to the program Wiley Coyote!

底线是:不要触发来自验证的输入。相反,从输入触发验证并相应地采取行动。

 类似资料:
  • 我的循环一直在进行,即使我输入了y、yes、n或no。 输出: 抱歉,该答案无效,请重试。是否要重新滚动模具1?不 抱歉,该答案无效,请重试。是否要重新滚动模具1?对 抱歉,该答案无效,请重试。是否要重新滚动模具1?对

  • 我有一些代码,其中多个方法使用键盘,并在主方法中连续调用。我正在做的练习特别要求使用4种不同的方法,所以我不能把它们放在一起。最初,我用键盘。在每个方法的末尾关闭(),但当第二个方法运行时,无论调用顺序如何,这都会导致NoTouchElementException。通过卸下键盘。close(),代码现在可以工作了,但是我现在收到了资源泄漏的警告,因为键盘没有关闭。有人能告诉我一种关闭输入而不出错的

  • 我有一个try/catch块,我已将其写入JetBrains网络StormIDE,它会给我一个错误。错误如下:“本地捕获的异常的‘抛出’/此检查报告任何JavaScript抛出语句的实例,其异常总是通过包含try语句来捕获。使用抛出语句作为“goto”来更改本地控制流可能会令人困惑。” 如果我将活动从捕获块放入尝试块的 if 块中,那么我将不需要尝试/捕获/最终。那么,除了条件语句(if)之外,你

  • 我正在尝试制作一个闰年计算器,它还可以告诉你是无意中输入了字符串还是双精度而不是整数。我想让这个程序反复运行“错误。请输入一个不带小数的数字:”直到用户输入一个整数。然而,目前,对于第一个try-catch块,如果我输入了两种错误的输入类型,它会给我以下错误消息: 第二个至少稍微好一点,它不断重复我输入的最后一个整数的结果(年份“是闰年/不是闰年”),但至少它永远重复,不像第一个。 所有我想要的错

  • 我是C#的新手,我有一些Java方面的基础知识,但我不能让这段代码正常运行。 它只是一个基本的计算器,但当我运行程序时,VS2008给了我这个错误: 我做了几乎相同的程序,但在Java使用的是JSwing,它运行得非常好。 下面是C#的形式: 会有什么问题?有没有办法解决? PS:我也试过 但没有奏效。

  • 嘿,我必须使用 JOptionPane 向用户询问购买金额,如果他们输入超过小数点后两位、任何内容、字符或多于小数点,程序必须显示错误消息并停止。 我该怎么做? 我不希望有人为我编写程序,只是一个解释我将如何做的链接 如果用户输入“12.526”或“”或“1.3.25”或“abc”,我希望程序显示错误消息并停止。 由于这似乎是一个令人困惑的问题,或者我问错了,这些是我的老师的指示: 程序必须要求用