我试图检查用户是否输入了他们的名字,有或没有空格,即乔·布洛格斯。他们的名字中不能有特殊的字符或数字,否则会弹出一条错误信息,即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、编写一个简单的验证函数
这比你想象的要容易,尤其是因为标准库提供了一些简洁的算法来为你做很多迭代工作。
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块,如果我输入了两种错误的输入类型,它会给我以下错误消息: 第二个至少稍微好一点,它不断重复我输入的最后一个整数的结果(年份“是闰年/不是闰年”),但至少它永远重复,不像第一个。 所有我想要的错
我有一个try/catch块,我已将其写入JetBrains网络StormIDE,它会给我一个错误。错误如下:“本地捕获的异常的‘抛出’/此检查报告任何JavaScript抛出语句的实例,其异常总是通过包含try语句来捕获。使用抛出语句作为“goto”来更改本地控制流可能会令人困惑。” 如果我将活动从捕获块放入尝试块的 if 块中,那么我将不需要尝试/捕获/最终。那么,除了条件语句(if)之外,你
我是C#的新手,我有一些Java方面的基础知识,但我不能让这段代码正常运行。 它只是一个基本的计算器,但当我运行程序时,VS2008给了我这个错误: 我做了几乎相同的程序,但在Java使用的是JSwing,它运行得非常好。 下面是C#的形式: 会有什么问题?有没有办法解决? PS:我也试过 但没有奏效。
嘿,我必须使用 JOptionPane 向用户询问购买金额,如果他们输入超过小数点后两位、任何内容、字符或多于小数点,程序必须显示错误消息并停止。 我该怎么做? 我不希望有人为我编写程序,只是一个解释我将如何做的链接 如果用户输入“12.526”或“”或“1.3.25”或“abc”,我希望程序显示错误消息并停止。 由于这似乎是一个令人困惑的问题,或者我问错了,这些是我的老师的指示: 程序必须要求用